博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何判断两个接口返回的json数据是否有diff?
阅读量:7186 次
发布时间:2019-06-29

本文共 7572 字,大约阅读时间需要 25 分钟。

背景:在工作中经常会遇到接口迁移,但是呢又需要保证迁移前后返回的数据是一致的,这时候就需要做diff测试

分析:接口返回的json 数据中包含很多类型的字段,例如:object,jsonObject,String,jsonArray等等,因此需要分别写几个函数实现:jsonObject,jsonArray,Object的diff

 

 
 
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; public class BasicDiff {
public static class DiffResult{
private Boolean hasDiff = false; private String diffMessage; public Boolean getHasDiff() {
return hasDiff; } public void setHasDiff(Boolean hasDiff) {
this.hasDiff = hasDiff; } public String getDiffMessage() {
return diffMessage; } public void setDiffMessage(String diffMessage) {
this.diffMessage = diffMessage; } @Override public String toString() {
return "DiffResult{" + "hasDiff=" + hasDiff + ", diffMessage='" + diffMessage + '\'' + '}'; } } DiffResult diffResult=new DiffResult();
public  DiffResult compareObject(Object oldObject,Object newObject, String key, int index) {        if(oldObject == null || newObject == null){            diffResult.hasDiff = true;            diffResult.setDiffMessage(key+" 的value中old和new有一个或者两个为null");            return diffResult;        }        if(oldObject!=null&&newObject!=null) {            if (diffResult.getHasDiff()) {                return diffResult;            }            if (oldObject != null && newObject != null && oldObject.getClass() != newObject.getClass()) {                diffResult.hasDiff = true;                diffResult.setDiffMessage(key + " 的value的old和new 的类型不一致");                return diffResult;            }            if (oldObject instanceof JSONObject && newObject instanceof JSONObject) {                compareJsonObject((JSONObject) oldObject, (JSONObject) newObject, key, index);                if (diffResult.getHasDiff()) {                    return diffResult;                }            } else if (oldObject instanceof JSONArray && newObject instanceof JSONArray) {                compareJsonArray((JSONArray) oldObject, (JSONArray) newObject, key, index);                if (diffResult.getHasDiff()) {                    return diffResult;                }            } else {                String oldStr = oldObject.toString();                String newStr = newObject.toString();                if (!oldStr.equals(newStr)) {                    diffResult.hasDiff = true;                    diffResult.setDiffMessage("index: " + index + ", " + key + " 的value中old和new 的值不相等");                    return diffResult;                }            }        }        return diffResult;    }    public  DiffResult compareJsonArray(JSONArray oldJarr, JSONArray newJarr, String key, int index) {        if(diffResult.getHasDiff()){            return diffResult;        }        if(oldJarr == null || newJarr == null){            diffResult.hasDiff = true;            diffResult.setDiffMessage(key+" 的value中两个结果存在null");            return diffResult;        }        if(oldJarr.size() != newJarr.size()){            diffResult.hasDiff = true;            diffResult.setDiffMessage("index:"+ index+", "+key + " 的value中old和new 数组size不相等");            return diffResult;        }        //jsonarray中元素是个object,排序之后再比较        if(oldJarr.size() > 0 && !(oldJarr.get(0) instanceof JSONObject) && !(oldJarr.get(0) instanceof JSONArray)){            String[] arrOld = new String[oldJarr.size()];            String[] arrNew = new String[oldJarr.size()];            List
tmp = new ArrayList
(); for(int i = 0; i < arrOld.length; i++){ arrOld[i] = oldJarr.get(i).toString(); arrNew[i] = newJarr.get(i).toString(); tmp.add(oldJarr.get(i).toString()); } Arrays.sort(arrOld); Arrays.sort(arrNew); for(int i = 0; i < arrNew.length; i++){ if(!arrOld[i].equals(arrNew[i])){ diffResult.hasDiff = true; diffResult.setDiffMessage("index:"+ index+", "+key + " 的value中第"+tmp.indexOf(arrOld[i])+"个old和new 值不相等"); return diffResult; } } }else{ for(int i = 0; i < oldJarr.size(); i++){ if(oldJarr.get(i) != null && newJarr.get(i) != null && oldJarr.get(i).getClass()!= newJarr.get(i).getClass()){ diffResult.hasDiff = true; diffResult.setDiffMessage("index:"+ index+", "+key + " 的value中old和new 的类型不一致"); return diffResult; } if(oldJarr.get(i) instanceof JSONObject){ JSONObject jold = (JSONObject)oldJarr.get(i); JSONObject jnew = (JSONObject)newJarr.get(i); if(jold.equals(jnew)){ continue; }else{ Boolean cd = customHasDiff(oldJarr,newJarr,key,i,diffResult); if(!cd) continue; compareJsonObject((JSONObject)oldJarr.get(i),(JSONObject)newJarr.get(i),key,i); if(diffResult.getHasDiff()){ return diffResult; } } }else if(oldJarr.get(i) instanceof JSONArray) { compareJsonArray((JSONArray) oldJarr.get(i), (JSONArray) newJarr.get(i), key, i); if(diffResult.getHasDiff()){ return diffResult; } } } } return diffResult; }

public DiffResult compareJsonObject(JSONObject oldJson, JSONObject newJson, String key, int index) {

if(diffResult.getHasDiff()){
return diffResult;
}
if(oldJson == null || newJson == null){
diffResult.hasDiff = true;
diffResult.setDiffMessage(key+" 的value中两个结果存在null");
return diffResult;
}

 

Set<String> sold = oldJson.keySet();

Set<String> snew = newJson.keySet();
if (key.isEmpty()) {
key = "root";
}
//keysize是否相等
if (sold.size() != snew.size()) {
diffResult.hasDiff = true;
diffResult.setDiffMessage(key + " 的keySet的数量不一致,线上有" + sold.size() + "个key,待测服务有" + snew.size() + "个key");
return diffResult;
}

 

//key是否相同

for (String kold : sold) {
if (!snew.contains(kold)) {
diffResult.hasDiff = true;
diffResult.setDiffMessage("待测服务的" + key + "的keyset不包含" + kold);
return diffResult;
}
}
//value进行校验
for(String kold :sold){

 

//此处是进行过滤的,如果哪些字段不需要进行diff,就在这里过滤掉,例如接口返回的globalid,每次返回的值都不一样,不需要进行diff

if(kold.equals("globalId")) {
continue;
}

 

Object oldObject = oldJson.get(kold);

Object newObject = newJson.get(kold);
compareObject(oldObject, newObject, key + "->" + kold, index);
if (diffResult.getHasDiff()) {
return diffResult;
}

 

}

 

return diffResult;

}

}

 

  写好了diff比较的工具类就可以用来进行比较了:下面是如何使用的代码

String resultOnline = httpClientTool.doGetNoProxy(onlineUrl, null, "utf-8",headers);Thread.sleep(100);String resultNeedDiff=httpClientTool.doGetNoProxy(needDiffUrl,null,"utf-8",headers);JSONObject resultObject1=JSON.parseObject(resultOnline);JSONObject resultObject2=JSON.parseObject(resultNeedDiff);BasicDiff bf=new BasicDiff();d1=bf.compareObject(resultObject1,resultObject2,"",0)                if(d1.getHasDiff()){                       System.out.println("============有diff==========");                        System.out.println(d1.getHasDiff());}

 

 

转载于:https://www.cnblogs.com/zhaijing/p/8473252.html

你可能感兴趣的文章
jQuery之post方法
查看>>
用jquery 写的类似微博发布的效果
查看>>
【JAVA】空指针异常
查看>>
《BOOST程序库完全开发指南》 第08章 算法
查看>>
采集HeapDump、ThreadDump
查看>>
DWZ 解决隐藏左侧菜单项 刷新无法点开的bug
查看>>
vc++中如何让控制台程序不弹出DOS窗口
查看>>
ThinkpadR61-7755BH1安装Mac Leopard10.5.2
查看>>
python 验证数据类型函数
查看>>
每天一个linux命令(26):用SecureCRT来上传和下载文件
查看>>
在读iOS官方文档时,里面有很多你不懂的单词,不要担心
查看>>
Fedora 17: Grub Rescue
查看>>
不是每个在你身上拉屎的都是你的敌人
查看>>
Linq补漏笔记二:Linq语言技术基础
查看>>
#pragma once
查看>>
node.js打开浏览器
查看>>
四、Oracle的复杂查询
查看>>
logback高级特性一
查看>>
超棒的自定义超酷滚动条jQuery插件 - Perfect Scrollbar
查看>>
进程组 会话组 控制终端
查看>>