0

有 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);
}

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

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

  2. harcrest allOf/anyOf也不是一个解决方案,因为它在第一次匹配的断言上失败,而不是结合它们。

PS任何关于 json diff 可视化的建议都是受欢迎的。理想的方式是这样的。(但这是在 javascript 中)

4

1 回答 1

0

首先,接受以下内容:

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

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

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

  1. 创建一个接受 JSON 并输出规范 JSON 形式的工具(可能是单个类)(这是此解决方案的重要部分):
  2. 获取两个 JSON 值的规范 JSON 形式。
  3. 使用 . 比较规范的 JSON 格式assertEquals
于 2019-05-02T17:23:26.523 回答