如何缩短用于标识数组中单个元素的 json 路径?

How to shorten the json path used to identify a single element within an array?

请假定以下响应

{
  "animals": [
    {
      "name": "hobba",
      "embeddedData": {
        "age": "3",
        "color": "white"
      }
    },
    {
      "name": "obba",
      "embeddedData": {
        "age": "1",
        "color": "yellow"
      }
    }
  ]
}

我需要断言数组中存在具有特定值的元素。我是这样做的:

JsonPath jsonPath = response.jsonPath();
Assert.assertNotNull("Error message", jsonPath .param("name", "hobba").param("age", "3").param("color", "white").get("animals.find { a -> a.name == name && a.embeddedData.age == age && a.embeddedData.color == color"));

如您所见,我必须在每个需要断言其值的元素之前键入 a.embeddedData。这只是一个示例,因为将有许多元素来声明它们的值。

有没有更易读和循环友好的方法来做到这一点? 另外,如果 embeddedDataanimals 中有一个数组,我如何仍然对 animals 中的每个元素执行断言?

您可以使用带有匹配器的内置断言功能检查正文:

.then()
    .assertThat()
    .root("animals.embeddedData")
    .body("age", Every.everyItem(Matchers.notNullValue()))
    .body("color", Every.everyItem(Matchers.notNullValue()))