解析 JSON Schema 文档生成 Java 代码

根据 JSON Schema 文档生成 Java 代码,使用的是 GitHub 上的开源项目 jsonschema2pojo,该项目有多种使用方式,详细看文档,这里采用引入依赖方式

步骤如下

  1. 项目中引入依赖,准备对应的 JSON Schema 文档

  2. 编写解析 JSON Schema 文档 的代码

  3. 执行程序即可

详细步骤

引入依赖

<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;
    }

}