comapre 2如何通过单个比较用多个json路径过滤json?

时间:2019-05-02 16:57:18

标签: java json jsonpath jsonassert

有2个json,两个json都需要应用多个路径。然后,应通过测试中的一些断言来比较这些json。 ide解决方案应该是:

Stirng actualJson - ....
Stirng expectedJson - ....
Stirng actualJsonFiltered - filter(actualJson, lisofJsonPath);
Stirng expectedJsonFiltered - filter(expectedJson, lisofJsonPath);

JSONAssert.assertEquals(actualJsonFiltered, expectedJsonFiltered);

什么是不是解决方案: 1.任何类似的代码:

for(String p: lisofJsonPath) {
    assertEquals(JsonPath.read(actualJson, p), JsonPath.read(expectedJson , p);
}

需要过滤json并使用所有现有路径显示/失败。显示错误,指出多个路径不匹配。 不是一对一的json路径匹配。

  1. org.assertj.core.api.SoftAssertions-也不是解决方案,因为很难从消息中了解哪些资产失败。

  2. harcrest allOf / anyOf也不是解决方案,因为它在第一次匹配的评估中失败,没有将它们组合在一起。

PS 。关于json diff可视化的任何建议都是很好的。理想的方式看起来像this。 (但这是在javascript中)

1 个答案:

答案 0 :(得分:0)

首先, 接受以下内容:

  1. JSON是键/值对的无序集合。
  2. 很难比较任何东西的无序集合。
  3. 如果您对键值对(按键排序)进行排序,并且将JSON值表示为字符串(例如:“ {\” keyA \“:\” blam \“,\” keyB \“:\ “ kapow \”}“),您可以使用字符串比较来比较JSON值。

我将JSON的排序形式称为“规范JSON形式”。

一旦您接受以上内容为真实和/或真实, 这将成为您解决问题的方法:

  1. 创建一个接受JSON并输出规范的JSON形式的工具(也许是单个类)(这是该解决方案的重要部分):
  2. 获取两个JSON值的规范JSON形式。
  3. 使用assertEquals比较规范的JSON形式。