当前位置: 首页 > 知识库问答 >
问题:

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

纪正德
2023-03-14

我正在比较两个JSON字符串,如果不相同,也会得到差异。这里我想在比较时忽略几个字段。杰克逊会提供这个设施还是其他更好的图书馆?

Json1:

{
    "name": "something",
    "id": "1",
    "version": "123"
}

Json2:

{
    "name": "nothing",
    "id": "1",
    "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时忽略版本。

杰克逊能做到这一点吗?还有其他更好的图书馆吗?

共有2个答案

应子真
2023-03-14

通过使用不同的LIB,我成功地实现了这一目标:

进口

    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);
蒋健
2023-03-14

如果您需要现成的实施,那么您可以参考:https://github.com/java-json-tools/json-patch

否则,如果需求是针对简单的嵌套对象,并且您想在比较过程中忽略属性,您可以实现ObjectMapper并覆盖equals方法。要从比较中删除文件,您可以这样做:

((ObjectNode)node1).remove("version");
((ObjectNode)node2).remove("version");

然后,您可以简单地调用JsonDiff进行分析。

 类似资料:
  • 我知道如何计算出字符串中某个字符或数字的索引,但是有没有任何预定义的方法可以用来给我第n个位置的字符?所以在字符串“foo”中,如果我要求索引为0的字符,它会返回“f”。 注意——在上面的问题中,我所说的“字符”不是指字符数据类型,而是字符串中的字母或数字。这里重要的一点是,调用该方法时,我不会收到char,而是一个字符串(长度为1)。我知道substring()方法,但我想知道是否有更简洁的方法

  • 我有一个方法,它返回字符串类型的字段对象列表。 这个方法应该将所有字符串字段都大写: 问题是:"field.set(...)"不起作用。它应该将值大写并将其设置为该字段的新值,但它不起作用...我如何解决这个问题的任何想法?(PS:在真正的代码中,"something Class.class"被设置为真正的类名...) 正在生成的错误是field.get(this)方法(insdefield.se

  • 问题内容: 我知道如何计算字符串中某个字符或数字的索引,但是我可以使用任何预定义的方法在第n个位置给我该字符吗?因此,在字符串“ foo”中,如果我要求索引为0的字符,它将返回“ f”。 注意-在上述问题中,“字符”不是字符数据类型,而是字符串中的字母或数字。这里重要的是,调用该方法时,我不会收到字符,而是一个字符串(长度为1)。而且我知道substring()方法,但是我想知道是否有更整洁的方法

  • 问题内容: 我需要从两个字符之间获取字符串。我有这个 并且必须在一个变量中分别返回4个字符串: 问题答案: 有。由于它接受正则表达式字符串,并且是正则表达式中的特殊字符,因此您需要对其进行转义(带有反斜杠)。而且,由于是在Java中字符串字面特殊字符,你需要逃脱 它 ,也一样,人们有时会感到迷惑。因此给出: 然后 将输出 ( 在 前三位上 有 尾随空格;如果需要,这些空格。)

  • 问题内容: 这是我想要的行为: 问题答案: 我认为该示例将针对您的特定情况工作,而不会造成太多麻烦,也不会遇到python软件版本(请升级至2.7)的互操作性问题: 输出: 进行一些调整,您就可以得到想要的…。如果有帮助,请告诉我:-) 更新资料 您还可以使用以下命令: 输出: 更新2 您可以这样修改代码: 输出:

  • 问题内容: 我从html解析中得到一个字符串,即 我的代码是这样的 我不确定我的第二个拆分字符串应该是“’”还是“’,” 我希望我的结果是 问题答案: 我将使用正则表达式从这样的复杂输入中提取子字符串。 Swift 3.1: Swift 2.0: