解析 JSON Schema 文档生成 Java 代码
根据 JSON Schema 文档生成 Java 代码,使用的是 GitHub 上的开源项目 jsonschema2pojo,该项目有多种使用方式,详细看文档,这里采用引入依赖方式
步骤如下
-
项目中引入依赖,准备对应的 JSON Schema 文档
-
编写解析 JSON Schema 文档 的代码
-
执行程序即可
详细步骤
引入依赖
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.jsonschema2pojo</groupId>
<artifactId>jsonschema2pojo-core</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
解析 JSON Schema 文档的核心代码
生成实例类代码
import com.sun.codemodel.JCodeModel;
import org.jsonschema2pojo.*;
import org.jsonschema2pojo.rules.RuleFactory;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class Example {
public static void main(String[] args) throws IOException {
JCodeModel codeModel = new JCodeModel();
// URL source = Example.class.getResource("/demo.json");
final URL source = new File("E:\\workspace\\local\\sdk-third\\chenfu\\src\\main\\resources\\demo.json").toURI().toURL();
GenerationConfig config = new DefaultGenerationConfig() {
@Override
public boolean isIncludeConstructorPropertiesAnnotation() {
return false;
}
@Override
public boolean isIncludeToString() {
return false;
}
@Override
public boolean isIncludeHashcodeAndEquals() {
return false;
}
@Override
public boolean isIncludeAllPropertiesConstructor() {
return true;
}
@Override
public boolean isIncludeGeneratedAnnotation() {
return false;
}
@Override
public boolean isUseInnerClassBuilders() {
return super.isUseInnerClassBuilders();
}
@Override
public boolean isSerializable() {
return true;
}
@Override
public boolean isUseDoubleNumbers() {
return false;
}
@Override
public boolean isUseBigDecimals() {
return true;
}
@Override
public boolean isUseLongIntegers() {
return super.isUseLongIntegers();
}
};
// final AbstractAnnotator annotator = new Jackson2Annotator(config);
final GsonAnnotator annotator = new GsonAnnotator(config);
SchemaMapper mapper = new SchemaMapper(new RuleFactory(config, annotator, new SchemaStore()), new SchemaGenerator());
mapper.generate(codeModel, "ClassName", "com.chenfu", source);
final File path = new File("E:\\workspace\\local\\sdk-third\\chenfu\\src\\main\\resources");
codeModel.build(path);
}
}
测试案例
demo.json
{
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32",
"description": "返回标记:成功=0,失败=1"
},
"data": {
"type": "boolean",
"description": "数据"
},
"msg": {
"type": "string",
"description": "返回信息"
},
"ok": {
"type": "boolean"
}
},
"title": "响应信息",
"description": "响应信息主体"
}
Demo.java
package com.chenfu;
import java.io.Serializable;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
/**
* 响应信息
* <p>
* 响应信息主体
*/
public class Demo implements Serializable {
private final static long serialVersionUID = -8028169617875788750L;
/**
* 返回标记:成功=0,失败=1
*/
@SerializedName("code")
@Expose
private Integer code;
/**
* 数据
*/
@SerializedName("data")
@Expose
private Boolean data;
/**
* 返回信息
*/
@SerializedName("msg")
@Expose
private String msg;
@SerializedName("ok")
@Expose
private Boolean ok;
/**
* 返回标记:成功=0,失败=1
*/
public Integer getCode() {
return code;
}
/**
* 返回标记:成功=0,失败=1
*/
public void setCode(Integer code) {
this.code = code;
}
/**
* 数据
*/
public Boolean getData() {
return data;
}
/**
* 数据
*/
public void setData(Boolean data) {
this.data = data;
}
/**
* 返回信息
*/
public String getMsg() {
return msg;
}
/**
* 返回信息
*/
public void setMsg(String msg) {
this.msg = msg;
}
public Boolean getOk() {
return ok;
}
public void setOk(Boolean ok) {
this.ok = ok;
}
}