javajsondiff的简单介绍

如何判断两个接口返回的json数据是否有diff

背景:在工作中经常会遇到接口迁移,但是呢又需要保证迁移前后返回的数据是一致的,这时候就需要做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!=nullnewObject!=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()];

           ListString tmp = new ArrayListString();            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;

}

SetString sold = oldJson.keySet();

SetString 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());

}

javajsondiff的简单介绍

java怎么读取json格式的数据

java可以使用JSONObject和JSONArray来操作json对象和json数组,具体用法如下

1:java对象与json串转换:

java对象—json串:

JSONObject JSONStr = JSONObject.fromObject(object);

String str = JSONStr.toString();

json串—java对象:

JSONObject jsonObject = JSONObject.fromObject( jsonString );

Object pojo = JSONObject.toBean(jsonObject,pojoCalss);

2:java数组对象与json串转换:

java数组—json串:

JSONArray arrayStr = JSONArray.fromObject(List?);

String str = arrayStr.toString();

json串—java数组:

JSONArray array = JSONArray.fromObject(str);

List? list = JSONArray.toList(array, ?.class);

diff对比json数据处理数据太慢了

1、如果对比json数据处理的速度太慢,可以考虑使用一些更有效的方法来优化性能,如减少数据量,使用哈希索引优化搜索,以及使用并行处理等技术。

2、此外,可以尝试使用一些特定的工具,如Jiffy或json-diff等,这些工具可以更有效地对比json数据,提高处理效率。

java怎么处理json格式数据

 1、通过谷歌的Gson来进行解析: 

json数据:sTotalString = {“message”:”success”,”result”:[{“surveyid”:”1″,”surveyname”:”B”}{surveyid”:”2″,”surveyname”:”C”}]};

2、通过json-org.jar包进行解析: 

json数据:sTotalString = {“message”:”success”,”result”:[{“surveyid”:”1″,”surveyname”:”B”}{surveyid”:”2″,”surveyname”:”C”}]};

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月25日 06:37:56
下一篇 2024年3月25日 06:46:19

相关推荐

  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4500
  • javascriptcanvas的简单介绍

    如何使用js在画布上绘制图形 1、可以使用 drawImage()方法把一幅图像绘制到画布上。 以使用三种不同的参数组合。最简单的调用方式是传入一个 HTML 元素,以及绘制该图像的起点的 x 和 y 坐标。 2、效果图:使用JavaScript在画布中绘制文本图形首先我们来看看要在画布上绘制文本图形,需要用到的最重要的属性和方法:font属性:定义文本的字…

    2024年5月23日
    4200
  • cortexm4linux的简单介绍

    Cortex-M4的主要功能 Cortex-M4提供了无可比拟的功能,以将[1] 32位控制与领先的数字信号处理技术集成来满足需要很高能效级别的市场。 Cortex-M4核心具有浮点单元(FPU)单精度,支持所有Arm单精度数据处理指令和数据类型。它还实现了一套完整的DSP指令和一个提高应用程序安全性的内存保护单元(MPU)。 主要是m4比m3多了dsp的支…

    2024年5月23日
    4400
  • 3desjavaphp的简单介绍

    php的3des加密结果与java不一致 他们的加密算法都是通用的,是可以解开的,只要你des的模式,加密长度,初始向量什么的都一样就可以。 JAVA写RSA加密,私钥都是一样的,公钥每次加密的结果不一样跟对数据的padding(填充)有关。Padding(填充)属性定义元素边框与元素内容之间的空间。padding简写属性在一个声明中设置所有内边距属性。 要…

    2024年5月23日
    4900
  • 黑客代码软件学习推荐歌曲的简单介绍

    我想自学编程代码,,目地是“黑”网站,开发出破解代码。有没有这方面的… 这个迭代周期不应该以周为周期或以月为周期发生,而是应该以日为周期。知识等待使用的时间越久,知识这把斧头就越钝。等待学习新知识的时间越长,你就越难以将其融入到代码中。 我认为这个问题问得本身就显得有点矛盾,想学却担心自己看不懂代码学不来,试问哪个编程人员不是从零开始的。坚定信念…

    2024年5月23日
    4800
  • java8种基本类型范围的简单介绍

    java中常用的数据类型有哪些 1、java数据类型分为基本数据类型和引用数据类型,基本数据类型有boolean 、long 、int 、char、byte、short、double、float。引用数据类型有类类型、接口类型和数组类型。 2、java中包含的基本数据类型介绍:\x0d\x0aJava共支持8种内置数据类型。内置类型由Java语言预先定义好,…

    2024年5月23日
    4900
  • linux系统与gpt的关系的简单介绍

    linux下查看分区是不是gpt 看分区会报错,比如:WARNING: GPT (GUID Partition Table) detected on /dev/sda! The util fdisk doesnt support GPT. Use GNU Parted.所以这个sda就是gpt的。 选择“管理”;在“磁盘管理”中,右键“磁盘0”,在弹出的右键…

    2024年5月23日
    5400
  • 北京黑客学习培训的简单介绍

    现在学什么好啊 包括建筑设计、服装设计、珠宝首饰设计等,选择适合自己的设计专业,好好学习,就业容易且收入高。学前教育专业:很多女生喜欢小孩子,且女生一般细心且有耐心,教育行业假期宽裕,工作环境单纯,就业机会多。 现在比较热门好就业的专业有人工智能、机械专业、电子商务专业、人力资源专业、金融学专业、小语种类专业等等。人工智能:人工智能领域的研究包括机器人、语言…

    2024年5月23日
    4200
  • javaee要学那些东西的简单介绍

    java主要学习哪些内容 1、学java最重要的是下面四个内容:掌握Java语言的使用:语言语法、程序逻辑,OOP(面向对象)思想,封装、继承、多态,集合框架、泛型、File I\O技术,多线程技术、socket网络编程,XML技术。 2、Java基础:了解Java的基本语法、数据类型、控制流程、数组、字符串等基础概念。学习面向对象编程(OOP)的原则和概念…

    2024年5月23日
    4300
  • excel自杀的简单介绍

    excel表格中宏代码,具有自杀功能,密码输入错误3次就自动删除表格_百度… 我给楼主一个建议,利用excel自身的密码保护,保护此工作簿的结构,将sheet提前隐藏。这样如果有人将同一份excel打开时,如果不能输入正确的密码,就不能将sheet取消隐藏,就能达到楼主所说的保护了。 如果你还有源文件的话,可以这样试试:打开其他的excel文件,…

    2024年5月23日
    8100

发表回复

登录后才能评论



关注微信