我想比较两个 JSON 字符串,这是一个巨大的层次结构,并且想知道它们在值上的不同之处。但是有些值是在运行时生成的并且是动态的。我想从我的比较中忽略那些特定的节点。
我目前正在使用 org.SkyScreamer 中的 JSONAssert 进行比较。它给了我很好的控制台输出但不忽略任何属性。
例如。
java.lang.AssertionError messageHeader.sentTime
expected:null
got:09082016 18:49:41.123
现在这是动态的,应该被忽略。就像是
JSONAssert.assertEquals(expectedJSONString, actualJSONString,JSONCompareMode, *list of attributes to be ignored*)
如果有人在 JSONAssert 中提出解决方案,那就太好了。但是,也欢迎使用其他方式。
原文由 Prateik 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以为此使用自定义。例如,如果您需要忽略名为“timestamp”的顶级属性,请使用:
也可以使用像“entry.id”这样的路径表达式。在您的自定义中,您可以使用任何您喜欢的方法来比较这两个值。上面的例子总是返回 true,不管期望值和实际值是多少。如果需要,您可以在那里做更复杂的事情。
忽略多个属性的值是完全没问题的,例如:
使用自定义时有一个警告:要以自定义方式比较其值的属性必须存在于实际的 JSON 中。如果您希望比较成功,即使该属性根本不存在,您也必须重写 CustomComparator,例如:
(通过这种方法,您仍然可以使用自定义以您想要的方式比较其他属性的值。)