本文,产生这个需求的原因是,api数据测试的时候需要校验json的数据格式,原来都是人眼去对比的,太折磨人了,作为程序员那就更加不能折磨自己了。
ps:让后台人员添加,后台人员懒得弄,反正折磨又不是他,好吧,那么只有靠自己了。
模板json:
{
"code": "0",
"msg": "ok",
"time": "2016-10-13 16:13:48",
"data": {
"count": 1,
"list": [
{
"pid": "商品id",
"title": "商品名称",
"price": "价格",
"desc": "商品描述"
}
]
}
}
目标json:
{
"code": "0",
"msg": "ok",
"time": "2016-10-13 16:13:48",
"test":"多添加的数据",
"data": {
"count": 1,
"list": [
{
"pid": "edb1eb3e82964efba7117fa7feed2f53",
"title": "牛B辣条",
"price": "12.00",
"desc": "炒鸡好吃的辣条,辣条里面的领导者。"
}
]
}
}
分析:
咱们看看这两个json数据,所有的key都是有层次结构的,其次所有的key是唯一的(当然也要考虑不公层次结构下,存在相同的key),
如果所有的key都唯一的,那么就可以遍历所有key,存到集合里面,然后对比这两个集合。
如果key不唯一,怎么办?那么只要保证key唯一不就行了吗,json有个特性,就是每一层结构下,key都是唯一的,那么只要在这个key前面加上层次结构,那么就保证了唯一了。
带有层次结构的key:
code,
msg,
time,
data,
data-count,
data-list,
data-list-pid,
data-list-title,
data-list-price,
data-list-desc,
撸码-获取带有层次结构的key:
public static ArrayList<String> getJsonKey(String head,JSONObject jsonObj){
ArrayList<String> keys = new ArrayList<>();
Set<Entry<String, Object>> set = jsonObj.entrySet();
Iterator<Entry<String, Object>> iter = set.iterator();
while (iter.hasNext()) {
Entry<String, Object> entry = iter.next();
String key = entry.getKey();
Object value = entry.getValue();
keys.add(head==null?key:head+key);
//判断value类型
if (value instanceof JSONObject) {
ArrayList<String> list = getJsonKey(head==null?key+"-":head+key+"-", (JSONObject) value);
keys.addAll(list);
}else if (value instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) value;
if (jsonArray.size()!=0) {
Object obj = jsonArray.get(0);
//对array中的类型进行判断
if (obj instanceof JSONObject) {
ArrayList<String> list = getJsonKey(head==null?key+"-":head+key+"-", (JSONObject)jsonArray.get(0));
keys.addAll(list);
}else{
keys.add(head==null?key:head+key);
}
}
}
}
return keys;
}
代码运行–>获取json中的key:
既然有了所有的key,那就可以对比了,对比过程就没啥说的,直接看运行效果:
忘了说了,这里的JSON解析库,用的是阿里的fastjosn