通过忽略特定字段来获取两个json字符串的差异

问题描述

我正在比较两个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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...