在比较两个JSON时忽略特定节点/属性

Pra*_*eik 12 java json jsonassert

我想比较两个JSON字符串,这是一个巨大的层次结构,并想知道它们在值上的不同之处.但是某些值是在运行时生成的并且是动态的.我想从我的比较中忽略那些特定的节点.

我目前正在使用org.SkyScreamer的JSONAssert进行比较.它给了我很好的控制台输出,但不会忽略任何属性.

对于前

java.lang.AssertionError messageHeader.sentTime
expected:null
got:09082016 18:49:41.123
Run Code Online (Sandbox Code Playgroud)

现在这是动态的,应该被忽略.就像是

JSONAssert.assertEquals(expectedJSONString, actualJSONString,JSONCompareMode, *list of attributes to be ignored*)
Run Code Online (Sandbox Code Playgroud)

如果有人在JSONAssert中建议解决方案,那将会很棒.然而,其他方式也是受欢迎的.

dkn*_*aus 14

您可以使用自定义.例如,如果您需要忽略名为"timestamp"的顶级属性,请使用:

JSONAssert.assertEquals(expectedResponseBody, responseBody,
            new CustomComparator(JSONCompareMode.LENIENT,
                new Customization("timestamp", (o1, o2) -> true)));
Run Code Online (Sandbox Code Playgroud)

也可以使用像"entry.id"这样的路径表达式.在您的自定义中,您可以使用您喜欢的任何方法来比较这两个值.无论期望值和实际值是什么,上面的示例始终返回true.如果需要,你可以在那里做更复杂的事情.

  • 定制路径表达式时的重要注意事项-匹配定制的路径采用正则表达式形式。 (2认同)
  • 您可以将 `checkJsonObjectKeysExpectedInActual` 方法实现简化为 `for (String attribute : attributeToIgnore) { Expected.remove(attribute); super.checkJsonObjectKeysExpectedInActual(前缀、预期、实际、结果); ` (2认同)

Sri*_*kar 8

您可以使用JsonUnit它具有您正在寻找的功能,我们可以忽略字段、路径和空值等。查看更多信息。对于示例,您可以忽略这样的路径

assertJsonEquals(
     "{\"root\":{\"test\":1, \"ignored\": 2}}", 
     "{\"root\":{\"test\":1, \"ignored\": 1}}", 
     whenIgnoringPaths("root.ignored")
);
Run Code Online (Sandbox Code Playgroud)

有时您需要在比较时忽略某些值。可以像这样使用 ${json-unit.ignore} 占位符

assertJsonEquals("{\"test\":\"${json-unit.ignore}\"}",
    "{\n\"test\": {\"object\" : {\"another\" : 1}}}");
Run Code Online (Sandbox Code Playgroud)