问题描述
我正在比较两个JSON字符串,并获得不同的区别。在这里,我想在比较时忽略一些字段。 杰克逊会提供这种便利还是其他图书馆更好?
Json1:
{
"name": "something","id": "1","version": "123"
}
Json2:
{
"name": "nothing","version": "12356"
}
我正在使用以下代码查找上述示例json字符串之间的区别
ObjectMapper mapper = new ObjectMapper();
JsonNode node1 = mapper.valueToTree(json1);
JsonNode node2 = mapper.valueToTree(json2);
String diff = JsonDiff.asJson(node1,node2).toString();
logger.info("Difference: " + diff);
但是我想在比较上述示例JSON的JSON时忽略版本。
Jackson 可以这样做还是可以使用其他更好的库吗?
解决方法
如果需要现成的实现,则可以参考: https://github.com/java-json-tools/json-patch
否则,如果要求是简单的嵌套对象,并且您想在比较期间忽略属性,则可以实现ObjectMapper并重写equals方法。 要从比较中删除文件,您可以执行以下操作:
((ObjectNode)node1).remove("version");
((ObjectNode)node2).remove("version");
然后,您只需调用JsonDiff进行分析即可。
,我可以通过使用不同的库成功实现它:
进口
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.flipkart.zjsonpatch.JsonDiff;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
代码段
DocumentContext existingDoc = JsonPath.parse(json1);
DocumentContext incomingDoc = JsonPath.parse(json2);
existingDoc.delete("version");
incomingDoc.delete("version");
JsonNode existingNode = mapper.readTree(existingDoc.jsonString());
JsonNode incomingNode = mapper.readTree(incomingDoc.jsonString());
String diffs = JsonDiff.asJson(existingNode,incomingNode).toString();
logger.info("Difference: " + diffs);