引言
为什么要自己重新造轮子,而不是采用第三方的JsonSchema方法进行实现
存在以下痛点:
1.我之前在网上找了很久,没有找到java版直接进行jsonschema生成的方法或直接比较的方法
2.http://JSONschema.net/#/home 使用这块框架,必须要先把我们的Json信息复制到该网页,然后通过该网页生成的jsonschema格式文件写到本地,效率实在过于低下
3.其次我相信很多人都已经实现这块方法,但一直没有开源出来,在此小弟做个抛砖引玉
设计思路
1.比较JSON的Value值是否匹配(在我个人看来有一定价值,但还不够,会引发很多不必要但错误)
2.能比较null值,比如 期望json中某个值是有值的,而实际json虽然存在这个key,但它的value是null
3.能比较key值是否存在
4.能比较jsonArray;
其中针对jsonArray要展开说明下;
1.对于jsonArray内所有的jsonObject数据肯定是同一类型的,因此我这边做的是只比较jsonArray的第一个JsonObject
2.对于jsonArray,大家可能会关心期望长度和实际长度是否有差异
总的而言,采用递归思路进行实现
现在直接附上代码,已实现generateJsonSchema方法直接把json信息 转换成jsonschema,再结合比对函数diffFormatJson,自动校验jsonschema
package com.testly.auto.core;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.junit.Test;
import java.util.Iterator;
/**
* Created by 古月随笔 on 2017/6/23.
*/
public class DiffMethod {
/**
* 返回当前数据类型
* @param source
* @return
*/
public String getTypeValue(Object source){
if(source instanceof String){
return "String";
}
if(source instanceof Integer){
return "Integer";
}
if(source instanceof Float){
return "Float";
}
if(source instanceof Long){
return "Long";
}
if(source instanceof Double){
return "Double";
}
if(source instanceof Date){
return "Date";
}
if(source instanceof Boolean){
return "Boolean";
}
return "null";
}
/**
* 把Object变成JsonSchema
* @param source
* @return
*/
public Object generateJsonSchema(Object source){
Object result = new Object();
//判断是否为JsonObject
if(source instanceof JSONObject){
JSONObject jsonResult = JSONObject.fromObject(result);
JSONObject sourceJSON = JSONObject.fromObject(source);
Iterator iterator = sourceJSON.keys();
while (iterator.hasNext()){
String key = (String) iterator.next();
Object nowValue = sourceJSON.get(key);
if(nowValue == null || nowValue.toString().equals("null")){
jsonResult.put(key,"null");
}else if(isJsonObject(nowValue)){
jsonResult.put(key,generateJsonSchema(nowValue));
}else if(isJsonArray(nowValue)){
JSONArray tempArray = JSONArray.fromObject(nowValue);
JSONArray newArray = new JSONArray();
if(tempArray !=