[JsonSchema] JsonSchema对比 (Java 版)

420 阅读3分钟

本工具主要是对两个JsonSchema字符串进行比较,入参是两个jsonshema的字符串,一定是jsonschema而不是对象的json字符串,具体可以看例子

工具类代码如下: `public class JsonSchemaUtil {

/**
 * @Author
 * @Description 比较target与origin的不同
 * @Date 上午11:31 2022/2/21
 * @Param [origin, target]
 * @return void
 **/
public static JsonCompareResult compare(String origin,String target){

    JsonCompareResult result = new JsonCompareResult();
    StringBuilder defect = new StringBuilder();
    StringBuilder change = new StringBuilder();
    // 多出来
    StringBuilder extra = new StringBuilder();

    JSONObject originObj = JSONObject.parseObject(origin);
    JSONObject targetObj = JSONObject.parseObject(target);

    // 解析原始json
    JSONObject jsonObject = originObj.getJSONObject("properties");
    // 解析对比json
    JSONObject targetJsonObject = targetObj.getJSONObject("properties");
    if(targetJsonObject == null && jsonObject != null){
        change.append("对象数据类型改变,新版本为空");
    }else if(targetJsonObject != null && jsonObject == null){
        change.append("对象数据类型改变,原版本为空");
    }else {
        for (Map.Entry entry : jsonObject.entrySet()) {
            String key = (String) entry.getKey();
            JSONObject valueObject = JSONObject.parseObject(entry.getValue().toString());
            String type = valueObject.getString("type");

            if (targetJsonObject.get(key) == null) {
                defect.append("缺少参数key=").append(key).append(";");
                continue;
            }
            if (targetJsonObject.get(key) != null) {
                JSONObject targetObject = JSONObject.parseObject(targetJsonObject.get(key).toString());
                String targetType = targetObject.getString("type");
                if (!type.equals(targetType)) {
                    change.append("参数key=").append(key).append("类型发生变化,从").append(type).append("改变为")
                            .append(targetType).append(";");
                }
                // 如果都是对象
                else if ("object".equals(type)) {
                    JsonCompareResult compare = compare(valueObject.toJSONString(), targetObject.toJSONString());
                    merge(defect,change,extra,compare,key);
                }

                // 如果都是数组
                else if ("array".equals(type)) {
                    JsonCompareResult compare = compare(valueObject.getJSONObject("items").toJSONString(), targetObject.getJSONObject("items").toJSONString());
                    merge(defect,change,extra,compare,key);
                }
            }
        }

        for (Map.Entry entry : targetJsonObject.entrySet()) {
            if (jsonObject.get(entry.getKey()) == null) {
                JSONObject valueObject = JSONObject.parseObject(entry.getValue().toString());
                String type = valueObject.getString("type");
                extra.append("增加参数key=").append(entry.getKey()).append(",类型type=").append(type);
            }
        }
    }

    result.setChange(change.toString());
    result.setDefect(defect.toString());
    result.setExtra(extra.toString());
    return result;
}

private static void merge(StringBuilder defect, StringBuilder change, StringBuilder extra, JsonCompareResult compare, String key) {
    if(StringUtils.isNotBlank(compare.getChange())){
        change.append("对象key=").append(key).append("部分数据类型发生变化(").append(compare.getChange()).append(");");
    }
    if(StringUtils.isNotBlank(compare.getDefect())){
        defect.append("对象key=").append(key).append("部分数据被移除(").append(compare.getDefect()).append(");");
    }
    if(StringUtils.isNotBlank(compare.getExtra())){
        extra.append("对象key=").append(key).append("存在新增字段(").append(compare.getExtra()).append(");");
    }
}


public static void main(String[] args) {
    String origin = "{\n" +
            "    \"type\":\"object\",\n" +
            "    \"description\":\"设计模板\",\n" +
            "    \"required\":[\n" +
            "        \"sql\",\n" +
            "        \"pageNo\",\n" +
            "        \"pageSize\",\n" +
            "        \"test\"\n" +
            "    ],\n" +
            "    \"title\":\"入参\",\n" +
            "    \"categoryId\":\"007dcc72c4000000\",\n" +
            "    \"properties\":{\n" +
            "        \"sql\":{\n" +
            "            \"type\":\"string\",\n" +
            "            \"title\":\"sql\",\n" +
            "            \"categoryId\":\"007dcc72c4000000\"\n" +
            "        },\n" +
            "        \"pageNo\":{\n" +
            "            \"type\":\"integer\",\n" +
            "            \"title\":\"页码\"\n" +
            "        },\n" +
            "        \"pageSize\":{\n" +
            "            \"type\":\"integer\",\n" +
            "            \"title\":\"显示数量\"\n" +
            "        },\n" +
            "        \"test\":{\n" +
            "           \"type\":\"string\"\n" +
            "        }\n" +
            "    }\n" +
            "}";

    String target = "{\n" +
            "    \"type\":\"object\",\n" +
            "    \"description\":\"设计模板\",\n" +
            "    \"required\":[\n" +
            "        \"sql\",\n" +
            "        \"pageNo\",\n" +
            "        \"pageSize\",\n" +
            "        \"tokenId\"\n" +
            "    ],\n" +
            "    \"title\":\"入参\",\n" +
            "    \"categoryId\":\"007dcc72c4000000\",\n" +
            "    \"properties\":{\n" +
            "        \"sql\":{\n" +
            "            \"type\":\"string\",\n" +
            "            \"title\":\"sql\",\n" +
            "            \"categoryId\":\"007dcc72c4000000\"\n" +
            "        },\n" +
            "        \"pageNo\":{\n" +
            "            \"type\":\"number\",\n" +
            "            \"title\":\"页码\",\n" +
            "            \"description\":\"大于1的整数,可以为空\"\n" +
            "        },\n" +
            "        \"pageSize\":{\n" +
            "            \"type\":\"number\",\n" +
            "            \"title\":\"每页数量\",\n" +
            "            \"description\":\"大于0的整数,可以为空\"\n" +
            "        },\n" +
            "        \"tokenId\":{\n" +
            "            \"type\":\"string\",\n" +
            "            \"title\":\"token\",\n" +
            "            \"categoryId\":\"007dcc72c4000000\"\n" +
            "        }\n" +
            "    }\n" +
            "}";


    String origin2 = "{\"type\":\"object\",\"description\":\"设计模板\",\"required\":[\"code\",\"msg\",\"data\"],\"title\":\"出参\",\"categoryId\":\"007dcc72c4000000\",\"properties\":{\"code\":{\"type\":\"integer\",\"title\":\"返回码\"},\"msg\":{\"type\":\"string\",\"title\":\"说明\",\"categoryId\":\"007dcc72c4000000\"},\"data\":{\"type\":\"object\",\"title\":\"数据\",\"properties\":{\"head\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"title\":\"\",\"properties\":{\"dataIndex\":{\"type\":\"string\",\"title\":\"数据索引\",\"categoryId\":\"007dcc72c4000000\"},\"title\":{\"type\":\"string\",\"title\":\"标题\",\"categoryId\":\"007dcc72c4000000\",\"description\":\"\"}},\"categoryId\":\"007dcc72c4000000\",\"required\":[\"dataIndex\",\"title\"]},\"title\":\"头信息\"},\"rows\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{},\"description\":\"这是一个map\"},\"title\":\"行数据\",\"description\":\"\"}},\"required\":[\"head\",\"rows\"]}}}";
    String target2 = "{\"type\":\"object\",\"description\":\"对象设计模板\",\"required\":[\"code\",\"message\",\"data\"],\"title\":\"出参\",\"categoryId\":\"007dcc72c4000000\",\"properties\":{\"code\":{\"type\":\"string\",\"title\":\"编码\",\"categoryId\":\"007dcc72c4000000\"},\"message\":{\"type\":\"string\",\"title\":\"消息\",\"categoryId\":\"007dcc72c4000000\"},\"data\":{\"type\":\"object\",\"title\":\"数据\",\"properties\":{\"head\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"title\":\"\"},\"rows\":{\"type\":\"object\",\"title\":\"行数据\",\"properties\":{}}},\"required\":[\"head\",\"rows\"]}}}";


    JsonCompareResult compare = JsonSchemaUtil.compare(origin2, target2);
    System.out.println(JSON.toJSONString(compare));
}

}`

实体类代码如下 `public class JsonCompareResult {

private String defect;
private String change;
private String extra;

public String getDefect() {
    return defect;
}

public void setDefect(String defect) {
    this.defect = defect;
}

public String getChange() {
    return change;
}

public void setChange(String change) {
    this.change = change;
}

public String getExtra() {
    return extra;
}

public void setExtra(String extra) {
    this.extra = extra;
}

}`

更多工具类请访问:github.com/EricLoveMia…