判断两个json是否相等(比较两个json对象中的hello属性的属性值是否相等)

本文目录
- 比较两个json对象中的hello属性的属性值是否相等
- 如何判断两个接口返回的json数据是否有diff
- Linux Shell jq比较json是否相同
- Python:比较两个json串是否相等,是直接把它当成字符串来比较呢还是json.loads(),转化一下再比较
- 两个json比较
- js 如何比较两个对象相等
比较两个json对象中的hello属性的属性值是否相等
比较两个json对象中的hello属性的属性值是否相等的方法。
1、json数据转换成字典。
2、将两个字典按key排好序,然后使用zip函数将两个字典对应的元素打包成元组。
3、比较对应的元素的value是否相等即可。
如何判断两个接口返回的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!=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;
String;
List《String》 tmp = new ArrayList《String》(); for(int i = 0; i 《 arrOld.length; i++){
arrOld = oldJarr.get(i).toString();
arrNew = 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)){
diffResult.hasDiff = true;
diffResult.setDiffMessage("index:"+ index+", "+key + " 的value中第"+tmp.indexOf(arrOld)+"个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比较的工具类就可以用来进行比较了:下面是如何使用的代码
***隐藏网址***
Thread.sleep(100);
***隐藏网址***
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());
}
Linux Shell jq比较json是否相同
问题:shell下使用jq比较两个json是否相等,第一个难点是KEY需要排序,第二个难点是array需要排序
Jq 本身提供-S参数使key进行排序
不过无法处理array.
jq提供了walk功能可以对所有的key进行遍历,同时他的example1就展示了如何对array进行排序,但apt中提供的jq不具有这个功能。
在github上找到了可以在jq1.5中使用walk的方法
最后写成了这个样子,
Python:比较两个json串是否相等,是直接把它当成字符串来比较呢还是json.loads(),转化一下再比较
其实如果你要包含 dict 的 compare json 是不可能的(json.dumps 加上 sort_keys=False 没用, 因为 whitespace 问题)。最好的方法是确保你的 json 来源是至多使用 list , 这样一来用 json.loads() 自然就达到你的 compare json(上面说了避免 whitespace 问题)。否则如果一定要用 dict 可是就要考虑 whitespace, 就要确保你的 json 来源是 in order 的(server 那里检查)。然后直接 字符串 str 比较。
两个json比较
由于HashMap是无顺序的,所以只要把这个json string转换成HashMap之后,用Map.equals()就可以比较它们是否相同了。
***隐藏网址***
那么可以这么做:
boolean compareJson(str1,str2) {
// 分别转换两个json string到json object
JSONObject json1 = new JSONObject(str1);
JSONObject json2 = new JSONObject(str2);
// 由于json object的tostring方法,是按指定的顺序来输出的,所以两个相同的json,输出的string应该相同。
if (json1.toString().equals(json2.toString()) return true;
return false;
}
js 如何比较两个对象相等
简单一点的就是对象转json字符串然后比对,如果对象属性顺序不一样的话也是会返回不一样的。
最简单有准确的就是获取对象的属性名做比对如果一样则再比对属性值是否一致。

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30





