赞
踩
本例子使用Jackson库来解析JSON字符串,并逐个比较JSON节点,包括对象、数组和值的差异。
主要功能包括:
ObjectMapper
对象,用于将JSON字符串转换为JsonNode
对象。
compareJson
方法接受两个JSON字符串,并将它们转换为JsonNode
对象,然后调用compareNodes
方法来逐个比较节点。
compareNodes
方法是递归的,它会处理对象、数组和值的差异。如果两个节点相同,它会直接返回。如果节点是对象,它会比较它们的字段,如果一个字段在一个JSON中有而在另一个中没有,它会报告缺失字段。如果节点是数组,它会比较它们的元素,如果数组长度不同,它会报告长度不同。如果节点是值,它会比较它们的内容,如果不同,它会报告值不同。
compareNodes
方法用于测试两个JSON字符串是否相同,以及它们之间的差异。
示例代码:
@Test
void text() {
String json1 = "{\"name\": \"小明\", \"age\": 30}";
String json2 = "{\"name\": \"大红\", \"age\": 30}";
try {
compareJson(json1, json2);
} catch (IOException e) {
e.printStackTrace();
}
}
public void compareJson(String json1, String json2) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); JsonNode tree1 = objectMapper.readTree(json1); JsonNode tree2 = objectMapper.readTree(json2); compareNodes(tree1, tree2); } private void compareNodes(JsonNode node1, JsonNode node2) { if (node1.equals(node2)) { return; } if (node1.isObject() && node2.isObject()) { node1.fieldNames().forEachRemaining(fieldName -> { if (!node2.has(fieldName)) { System.out.println("字符串 '" + fieldName + "' 在第二个JSON中丢失."); } else { JsonNode childNode1 = node1.get(fieldName); JsonNode childNode2 = node2.get(fieldName); compareNodes(childNode1, childNode2); } }); node2.fieldNames().forEachRemaining(fieldName -> { if (!node1.has(fieldName)) { System.out.println("字符串 '" + fieldName + "' 在第二个JSON中丢失."); } }); } else if (node1.isArray() && node2.isArray()) { int size1 = node1.size(); int size2 = node2.size(); if (size1 != size2) { System.out.println("数组大小不匹配: " + size1 + " 在第一个JSON中 and " + size2 + " 在第二个JSON中."); } int minSize = Math.min(size1, size2); for (int i = 0; i < minSize; i++) { compareNodes(node1.get(i), node2.get(i)); } } else { System.out.println("值不匹配: " + node1 + " 在第一个JSON中 and " + node2 + " 在第二个JSON中."); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。