Jsonschema2pojo从JSON生成Java类(Maven)
1.说明
jsonschema2pojo工具可以从JSON Schema(或示例JSON文件)生成Java类型,
并且可以配置生成Jackson 1.x,Jackson 2.x, Moshi 1.x或者Gson库的注解。
支持将jsonschema2pojo作为Maven插件、Ant任务、命令行工具、
Gradle插件或嵌入到Java应用程序中。
本文仅介绍Maven插件使用方式。
另外该工具还提供了在线版本,
可以在网站上直接使用:jsonschema2pojo online
2.创建Maven工程
Eclipse -> File -> New -> Other... -> Maven -> Maven Project
创建一个简单Maven工程,
pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>edu.yuwen.util</groupId>
<artifactId>json-file</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>generate-jsonschema2pojo</artifactId>
<description>jsonschema2pojo generates Java types from JSON Schema (or example JSON)</description>
</project>
3.引入Maven插件
Maven方式生成Java类需要jsonschema2pojo-maven-plugin,
在pom.xml引入这个插件:
<build>
<plugins>
<plugin>
<groupId>org.jsonschema2pojo</groupId>
<artifactId>jsonschema2pojo-maven-plugin</artifactId>
<version>1.0.2</version>
<configuration>
<sourceDirectory>${basedir}/src/main/resources/schema</sourceDirectory>
<targetPackage>com.example.types</targetPackage>
</configuration>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
里面的配置项指定了JSON schema文件的目录,
以及生成的Java类的包路径。
4.新建JSON Schema
在src/main/resources/schema目录下
新建JSON Schema文件address.schema.json:
{
"$id": "https://example.com/address.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "An address similar to http://microformats.org/wiki/h-card",
"type": "object",
"properties": {
"post-office-box": {
"type": "string"
},
"extended-address": {
"type": "string"
},
"street-address": {
"type": "string"
},
"locality": {
"type": "string"
},
"region": {
"type": "string"
},
"postal-code": {
"type": "string"
},
"country-name": {
"type": "string"
}
},
"required": [ "locality", "region", "country-name" ],
"dependencies": {
"post-office-box": [ "street-address" ],
"extended-address": [ "street-address" ]
}
}
5.运行Maven插件
运行Maven命令,
执行插件功能:
mvn generate-sources
或者
mvn package
Maven执行成功后,
会生成target/generated-sources/jsonschema2pojo/com/example/types/Address.java类。
推荐使用mvn generate-sources,
这样生成的target目录更干净些。
6.查看Address.java
package com.example.types;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
/**
* An address similar to http://microformats.org/wiki/h-card
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"post-office-box",
"extended-address",
"street-address",
"locality",
"region",
"postal-code",
"country-name"
})
public class AddressSchema {
@JsonProperty("post-office-box")
private String postOfficeBox;
@JsonProperty("extended-address")
private String extendedAddress;
@JsonProperty("street-address")
private String streetAddress;
/**
*
* (Required)
*
*/
@JsonProperty("locality")
private String locality;
/**
*
* (Required)
*
*/
@JsonProperty("region")
private String region;
@JsonProperty("postal-code")
private String postalCode;
/**
*
* (Required)
*
*/
@JsonProperty("country-name")
private String countryName;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("post-office-box")
public String getPostOfficeBox() {
return postOfficeBox;
}
@JsonProperty("post-office-box")
public void setPostOfficeBox(String postOfficeBox) {
this.postOfficeBox = postOfficeBox;
}
@JsonProperty("extended-address")
public String getExtendedAddress() {
return extendedAddress;
}
@JsonProperty("extended-address")
public void setExtendedAddress(String extendedAddress) {
this.extendedAddress = extendedAddress;
}
@JsonProperty("street-address")
public String getStreetAddress() {
return streetAddress;
}
@JsonProperty("street-address")
public void setStreetAddress(String streetAddress) {
this.streetAddress = streetAddress;
}
/**
*
* (Required)
*
*/
@JsonProperty("locality")
public String getLocality() {
return locality;
}
/**
*
* (Required)
*
*/
@JsonProperty("locality")
public void setLocality(String locality) {
this.locality = locality;
}
/**
*
* (Required)
*
*/
@JsonProperty("region")
public String getRegion() {
return region;
}
/**
*
* (Required)
*
*/
@JsonProperty("region")
public void setRegion(String region) {
this.region = region;
}
@JsonProperty("postal-code")
public String getPostalCode() {
return postalCode;
}
@JsonProperty("postal-code")
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
/**
*
* (Required)
*
*/
@JsonProperty("country-name")
public String getCountryName() {
return countryName;
}
/**
*
* (Required)
*
*/
@JsonProperty("country-name")
public void setCountryName(String countryName) {
this.countryName = countryName;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(AddressSchema.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('[');
sb.append("postOfficeBox");
sb.append('=');
sb.append(((this.postOfficeBox == null)?"<null>":this.postOfficeBox));
sb.append(',');
sb.append("extendedAddress");
sb.append('=');
sb.append(((this.extendedAddress == null)?"<null>":this.extendedAddress));
sb.append(',');
sb.append("streetAddress");
sb.append('=');
sb.append(((this.streetAddress == null)?"<null>":this.streetAddress));
sb.append(',');
sb.append("locality");
sb.append('=');
sb.append(((this.locality == null)?"<null>":this.locality));
sb.append(',');
sb.append("region");
sb.append('=');
sb.append(((this.region == null)?"<null>":this.region));
sb.append(',');
sb.append("postalCode");
sb.append('=');
sb.append(((this.postalCode == null)?"<null>":this.postalCode));
sb.append(',');
sb.append("countryName");
sb.append('=');
sb.append(((this.countryName == null)?"<null>":this.countryName));
sb.append(',');
sb.append("additionalProperties");
sb.append('=');
sb.append(((this.additionalProperties == null)?"<null>":this.additionalProperties));
sb.append(',');
if (sb.charAt((sb.length()- 1)) == ',') {
sb.setCharAt((sb.length()- 1), ']');
} else {
sb.append(']');
}
return sb.toString();
}
@Override
public int hashCode() {
int result = 1;
result = ((result* 31)+((this.postOfficeBox == null)? 0 :this.postOfficeBox.hashCode()));
result = ((result* 31)+((this.streetAddress == null)? 0 :this.streetAddress.hashCode()));
result = ((result* 31)+((this.postalCode == null)? 0 :this.postalCode.hashCode()));
result = ((result* 31)+((this.locality == null)? 0 :this.locality.hashCode()));
result = ((result* 31)+((this.countryName == null)? 0 :this.countryName.hashCode()));
result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode()));
result = ((result* 31)+((this.extendedAddress == null)? 0 :this.extendedAddress.hashCode()));
result = ((result* 31)+((this.region == null)? 0 :this.region.hashCode()));
return result;
}
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if ((other instanceof AddressSchema) == false) {
return false;
}
AddressSchema rhs = ((AddressSchema) other);
return (((((((((this.postOfficeBox == rhs.postOfficeBox)||((this.postOfficeBox!= null)&&this.postOfficeBox.equals(rhs.postOfficeBox)))&&((this.streetAddress == rhs.streetAddress)||((this.streetAddress!= null)&&this.streetAddress.equals(rhs.streetAddress))))&&((this.postalCode == rhs.postalCode)||((this.postalCode!= null)&&this.postalCode.equals(rhs.postalCode))))&&((this.locality == rhs.locality)||((this.locality!= null)&&this.locality.equals(rhs.locality))))&&((this.countryName == rhs.countryName)||((this.countryName!= null)&&this.countryName.equals(rhs.countryName))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.extendedAddress == rhs.extendedAddress)||((this.extendedAddress!= null)&&this.extendedAddress.equals(rhs.extendedAddress))))&&((this.region == rhs.region)||((this.region!= null)&&this.region.equals(rhs.region))));
}
}
7.引入插件依赖
当把Address.java放到工程的src/main/java目录下时,
Java编译会报错,
这是因为生成的类型依赖于Commons Lang的equals、hashCode和toString。
一些模式结构也会以Jackson注释的形式产生解析器提示。
需要在pom.xml中添加必要的依赖:
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
</dependencies>
8.新建JSON文件
上面演示了从JSON Schema生成Java类,
下面演示从JSON文件生成Java类,
首先在src\main\resources\json目录下,
新建一个JOSN文件person.json:
{
"name":"bob",
"age":33
}
9.修改插件配置
主要是指定了sourceType和sourceDirectory,
指定了源文件的格式是json和所在目录。
<build>
<plugins>
<plugin>
<groupId>org.jsonschema2pojo</groupId>
<artifactId>jsonschema2pojo-maven-plugin</artifactId>
<version>1.0.2</version>
<configuration>
<sourceType>json</sourceType>
<sourceDirectory>${basedir}/src/main/resources/json</sourceDirectory>
<outputDirectory>${basedir}/src/main/java</outputDirectory>
<targetPackage>com.example.types</targetPackage>
<addCompileSourceRoot>true</addCompileSourceRoot>
<annotationStyle>jackson2</annotationStyle>
</configuration>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
10.生成Person.java类
mvn generate-sources执行成功后,
会生成src/main/java/com/example/types/Person.java:
package com.example.types;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"name",
"age"
})
public class Person {
@JsonProperty("name")
private String name;
@JsonProperty("age")
private Integer age;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("name")
public String getName() {
return name;
}
@JsonProperty("name")
public void setName(String name) {
this.name = name;
}
@JsonProperty("age")
public Integer getAge() {
return age;
}
@JsonProperty("age")
public void setAge(Integer age) {
this.age = age;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(Person.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('[');
sb.append("name");
sb.append('=');
sb.append(((this.name == null)?"<null>":this.name));
sb.append(',');
sb.append("age");
sb.append('=');
sb.append(((this.age == null)?"<null>":this.age));
sb.append(',');
sb.append("additionalProperties");
sb.append('=');
sb.append(((this.additionalProperties == null)?"<null>":this.additionalProperties));
sb.append(',');
if (sb.charAt((sb.length()- 1)) == ',') {
sb.setCharAt((sb.length()- 1), ']');
} else {
sb.append(']');
}
return sb.toString();
}
@Override
public int hashCode() {
int result = 1;
result = ((result* 31)+((this.name == null)? 0 :this.name.hashCode()));
result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode()));
result = ((result* 31)+((this.age == null)? 0 :this.age.hashCode()));
return result;
}
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if ((other instanceof Person) == false) {
return false;
}
Person rhs = ((Person) other);
return ((((this.name == rhs.name)||((this.name!= null)&&this.name.equals(rhs.name)))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.age == rhs.age)||((this.age!= null)&&this.age.equals(rhs.age))));
}
}
11.插件配置项说明
- sourceType:两个可选值,JSON Schema或者JSON文件,默认为JSON Schema。
- sourceDirectory:源文件所在的目录,会将该目录下所有文件进行转换,不支持指定单个文件,如果不想全部转换,可以添加一个excludes节点。
- outputDirectory:生成Java Pojo类的(根)目录,生成Java类的目录为此目录+包目录,默认值为target/generated-sources/jsonschema2pojo。
- targetPackage:生成的Java pojo类的包路径。
- addCompileSourceRoot:是否将输出目录作为项目的源码根目录。
- annotationStyle:生成的(字段)注解样式,五个可选值:jackson1、jackson2、gson、moshi1和none,默认是jackson2,如果fastjson等工具不支持的,需要设置为none。
更多配置项的使用请参考:jsonschema2pojo-maven-plugin Optional Parameters
12.参考文章
使用maven根据JSON文件自动生成Java POJO类(Java Bean)源文件jsonschema2pojo github
Jsonschema2pojo从JSON生成Java类(Maven)的更多相关文章
- Jsonschema2pojo从JSON生成Java类(命令行)
1.说明 jsonschema2pojo工具可以从JSON Schema(或示例JSON文件)生成Java类型, 在文章Jsonschema2pojo从JSON生成Java类(Maven) 已经介绍过 ...
- YangTools从YANG生成Java类(Maven)
1.说明 ODL提供了Yang Tools工具从YANG文件生成Java类, 本文介绍使用Maven插件的方式生成, 基于yang-maven-plugin这个插件. 2.创建Maven工程 Ecli ...
- mybits根据表自动生成 java类和mapper 文件
mybits根据表自动生成 java类和mapper 文件 我这个脑子啊,每次创建新的工程都会忘记是怎么集成mybits怎么生成mapper文件的,so today , I can't write t ...
- mybatis怎样自动生成java类,配置文件?
其实没有什么东西是可以自动生成的,只不过是别人已经写好了,你调用罢了. 所以想要mybatis自动生成java类,配置文件等,就必须要一些配置和一些jar包.当然这些配置也很简单. 为了有个初步的认识 ...
- JSON生成c#类代码小工具
JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...
- JSP-讲解(生成java类、静态导入与动态导入)
一.JSP技术简介 JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护. JSP是HTML代码与Java代码的混合体. JSP文件通常以JSP或J ...
- 根据XML文件 生成 java类
最近一直在做关于webservice 的项目,这种项目最麻烦的就是根据对方的要求产生XML,文档里面虽然有XML结构,但是要转化为java里面的实体实在费劲, 有个自动化的工具就好了,半自动化也好,省 ...
- rpc框架: thrift/avro/protobuf 之maven插件生成java类
thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...
- 根据json生成java实体类
之前一篇讲过了XML转java实体对象,使用的是JAXB技术,今天给大家推荐一个在线转json到java实体对象: http://www.bejson.com/json2javapojo/new/ 转 ...
随机推荐
- javaAPI1
Iterable<T>接口, Iterator<T> iterator() Collection<E>:接口,add(E e) ,size() , Object[] ...
- mysqldump冷备份
数据库备份的重要性 提高系统的高可用性和灾难可恢复性,在数据库系统崩溃时,没有数据备份就没法找到数据. 使用数据库备份还原数据库,是数据库崩溃时提供数据恢复最小代价的最优方案. 没有数据库就没有一切, ...
- KVM配置
安装依赖包(因最小化安装) [root@slave-master ~]# yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pc ...
- 【Java基础】ArrayList初始化操作
要用60个零初始化列表,请执行以下操作: List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, ...
- [手写系列] Spirit带你实现防抖函数和节流函数
前言 防抖函数和节流函数,无论是写业务的时候还是面试的时候,想必大家已经听过很多次了吧.但是大家在用到的时候,有了解过他们之间的区别嘛,他们是如何实现的呢?还是说只是简单的调用下像lodash和und ...
- ios self.和_区别
- "self."调用该类的setter或getter方法,"_"直接获取自己的实例变量.property 和 instance variable 是有区别的. ...
- Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS)
内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...
- [BUUCTF]PWN3——warmup_csaw_2016
[BUUCTF]PWN3--warmup_csaw_2016 题目网址:https://buuoj.cn/challenges#warmup_csaw_2016 步骤: 例行检查,64位,没有开启任何 ...
- CF658A Bear and Reverse Radewoosh 题解
Content 一场比赛有 \(n\) 道题目,其中第 \(i\) 道题目的分值为 \(p_i\),需要花费的时间为 \(t_i\).需要说明的是,\(t_i\) 越大,这道题目的难度越大.在第 \( ...
- UVA294 约数 Divisors 题解
Content 给定 \(n\) 个区间 \([l,r]\),求出每个区间内约数个数最大的数. 数据范围:\(1\leqslant l<r\leqslant 10^{10}\),\(r-l\le ...