现有两个json对象,如何对它们进行比较?

~Je t''aime~� 2019-09-20 11:24:42
大环境是要做数据迁移测试,进行新老库的数据存储正确性比对

两个json对象(A和B,以A对象为主)
A:
[
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5",
}
]

B:
[
{
"key1": "value11",
"key2": "value21",
"key3": "value31",
"key4": "value41",
"key5": "value51",
}
]

现在两个json对象的key是一样的,但是对应的值不同,现在我想以A对象为主和B对象进行比较,若B对象的值和A对象不一致,就将B对象的键值都打印出来,请问在java中应该如何做?
...全文
908 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
天行归来 2019-09-20
  • 打赏
  • 举报
回复
主要代码如下,细节的需要完善下,比如对象是空的等。


	public static JSONArray getJSONArray(String str) {
		return JSON.parseArray(str);
	}

	public static boolean isEqual(String s1, String s2) {
		JSONArray ary1 = getJSONArray(s1);
		JSONArray ary2 = getJSONArray(s2);
		if (ary1==null || ary2==null) 
			return true;
		
		if (ary1.size()!=ary2.size()) 
			return false;
		
		for(int i=0; i<ary1.size(); i++) {
			JSONObject obj1 = (JSONObject) ary1.get(i);
			JSONObject obj2 = (JSONObject) ary2.get(i);
			if (!obj1.get("key1").equals(obj2.get("key1")) || !obj1.get("key2").equals(obj2.get("key2")) || 
				!obj1.get("key3").equals(obj2.get("key3")) || !obj1.get("key4").equals(obj2.get("key4")) ||
				!obj1.get("key5").equals(obj2.get("key5")) ) {
				System.out.println("不同对象,如:objA key1="+obj1.get("key1").toString()+",objB key1="+obj2.get("key1"));
				return false;
			}
		}
		
		return true;
	}

	public static void main(String[] args){
		String s1 = "[{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\",\"key4\":\"value4\",\"key5\":\"value5\"}]";
		String s2 = "[{\"key1\":\"value11\",\"key2\":\"value21\",\"key3\":\"value31\",\"key4\":\"value41\",\"key5\":\"value51\"}]";
		isEqual(s1,s2);
	}
IT烟酒僧^-^ 2021-12-15
  • 举报
回复 1
@天行归来 有一万个key是不是要累死你?
郅嫣 2019-09-20
  • 打赏
  • 举报
回复
对象属性都一样,新建一个实体类,new两个对象A和B,然后重写equals和hashCode方法就可以进行比较了。
  • 打赏
  • 举报
回复
引用 4 楼 dkwuxiang 的回复:
public boolean compareToAB(JSONArray objA, JSONArray objB) {
		boolean b = true;
		StringBuffer sBuffer = new StringBuffer();
		int objALength = objA.size();
		int objBLength = objB.size();
		String successStr = "字段值相同:";
		String failStr = "字段值不同:";
		String propertyStr = "已扫描到的字段:";
		JSONObject objJsonA = null;
		JSONObject objJsonB = null;
		if (objALength == objBLength) {
			for (int i = 0; i < objALength; i++) {
				objJsonA = objA.getJSONObject(i);
				objJsonB = objB.getJSONObject(i);

				for (String key : objJsonA.keySet()) {
					if (objJsonB.containsKey(key) && StringUtils.equals(objJsonA.getString(key), objJsonB.getString(key))) {
						System.out.println("successStr:" + key + "," + successStr);
					} else {
						b = false;
						System.out.println("failStr:" + key + "," + failStr);
					}
					System.out.println("propertyStr:" + key + "," + propertyStr);
				}
			}
		} else {
			b = false;
			sBuffer.append("两个对象长度不一致");
		}
		return b;
	}

//调用
String a = "[{\"key1\": \"value1\",\"key2\": \"value2\",\"key3\": \"value3\",\"key4\": \"value4\",\"key5\": \"value5\"}]";
		String b = "[{\"key1\": \"value11\",\"key2\": \"value2\",\"key3\": \"value3\",\"key4\": \"value4\",\"key5\": \"value5\"}]";
		JSONArray objAJson = JSONArray.parseArray(a);
		JSONArray objBJson = JSONArray.parseArray(b);
		new Test().compareToAB(objAJson, objBJson);

使用了fastjson
谢谢,您的代码很有用,
  • 打赏
  • 举报
回复


引用 5 楼 java不去卖麻辣烫 的回复:
先把这两个json存储为对象


Ojects.equls(a,b) 这个方法直接可以比较对象


Objects.equals() 这个方法 不好意思 写错了
  • 打赏
  • 举报
回复
先把这两个json存储为对象


Ojects.equls(a,b) 这个方法直接可以比较对象
dkwuxiang 2019-09-20
  • 打赏
  • 举报
回复
public boolean compareToAB(JSONArray objA, JSONArray objB) {
		boolean b = true;
		StringBuffer sBuffer = new StringBuffer();
		int objALength = objA.size();
		int objBLength = objB.size();
		String successStr = "字段值相同:";
		String failStr = "字段值不同:";
		String propertyStr = "已扫描到的字段:";
		JSONObject objJsonA = null;
		JSONObject objJsonB = null;
		if (objALength == objBLength) {
			for (int i = 0; i < objALength; i++) {
				objJsonA = objA.getJSONObject(i);
				objJsonB = objB.getJSONObject(i);

				for (String key : objJsonA.keySet()) {
					if (objJsonB.containsKey(key) && StringUtils.equals(objJsonA.getString(key), objJsonB.getString(key))) {
						System.out.println("successStr:" + key + "," + successStr);
					} else {
						b = false;
						System.out.println("failStr:" + key + "," + failStr);
					}
					System.out.println("propertyStr:" + key + "," + propertyStr);
				}
			}
		} else {
			b = false;
			sBuffer.append("两个对象长度不一致");
		}
		return b;
	}

//调用
String a = "[{\"key1\": \"value1\",\"key2\": \"value2\",\"key3\": \"value3\",\"key4\": \"value4\",\"key5\": \"value5\"}]";
		String b = "[{\"key1\": \"value11\",\"key2\": \"value2\",\"key3\": \"value3\",\"key4\": \"value4\",\"key5\": \"value5\"}]";
		JSONArray objAJson = JSONArray.parseArray(a);
		JSONArray objBJson = JSONArray.parseArray(b);
		new Test().compareToAB(objAJson, objBJson);

使用了fastjson
  • 打赏
  • 举报
回复
如果字段特别多的情况下,我想让自动获取key从而比较value这种情况呢,大概思路如下,但是感觉写的不太好,运行直接成功了,可是值明明不是一样的 public boolean compareToAB(Object objA, Object objB) { boolean b = true; if (objA instanceof JSONArray && objB instanceof JSONArray){ int objALength = objA.length(); int objBLength = objB.length(); if(objALength==objBLength){ for(int i =0;i<objALength;i++){ JSONObject resultJson = new JSONObject(); String successStr = "字段值相同:"; String failStr = "字段值不同:"; String propertyStr = "已扫描到的字段:"; JSONObject objJsonA = objA.getJSONObject(i); JSONObject objJsonB = objB.getJSONObject(i); Iterator iteratorA = objJsonA.keys(); Iterator iteratorB = objJsonB.keys(); while (iteratorA.hasNext()) { String keyA = (String) iteratorA.next(); String keyB = (String) iteratorB.next(); String valueA = objJsonA.get(keyA).toString(); String valueB = objJsonA.get(keyB).toString(); if (valueA.trim().equals(valueB.trim())) { successStr += keyA + ","; System.out.println("successStr:" + successStr); } else { failStr += keyA + ","; System.out.println("failStr:" + failStr); b = false; } propertyStr += keyA + ","; System.out.println("propertyStr:" + propertyStr); } resultJson.put("success", successStr); resultJson.put("fail", failStr); resultJson.put("property", propertyStr); System.out.println(resultJson.toString()); } }else{ sBuffer.append("两个对象长度不一致"); } } return b; } JSONArray objAJson = new JSONArray(objA); JSONArray objBJson = new JSONArray(objB); compareToAB(objAJson,objBJson);

50,522

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧