Java 使用JsonPath和Hamcrest匹配器匹配字符串列表的更好方法

Java 使用JsonPath和Hamcrest匹配器匹配字符串列表的更好方法,java,hamcrest,jsonpath,Java,Hamcrest,Jsonpath,我正在使用JsonPath测试API的REST端点。我的测试用例看起来像这样 首先,我创建新对象 class Item { String name; int id; List<String> places; } String name = "Randomname" + new Random().nextLong(); JSONObject obj = new Item(name, 3, Arrays.asList("Rome3", "Lond

我正在使用JsonPath测试API的REST端点。我的测试用例看起来像这样

首先,我创建新对象

class Item {         
    String name;
    int id;
    List<String> places;
}
String name = "Randomname" + new Random().nextLong();
JSONObject obj = new Item(name, 3, Arrays.asList("Rome3", "London3", "Paris3"));
post("/items").content(obj);
这是可行的,但我认为我做得不对,因为我有一个嵌套的
contains(contains())
。(我已经在本文末尾给出了完整的JSON响应。)

问题是,因为JsonPath表达式返回一个列表,所以我需要使用列表匹配器。例如,与其写这个

jsonPath("$.data[?(@.id == 1)].name", is("item 1"))
我需要这样写

jsonPath("$.data[?(@.id == 1)].name", contains("item 1"))
因为JsonPath表达式将返回一个元素的JSON列表

[
    "item 1"
]
这并不是很糟糕,但列表更糟糕,例如,试图检查变量位置中的字符串列表是否包含我想要的内容。返回的JSON是一个列表列表,因此这个JsonPath表达式

jsonPath("$.data[?(@.id == 1)].places"
我会退还这个

        [ 
            [
                "Rome2",
                "London3",
                "Paris3"
            ]
         ]
所以它需要一个嵌套的hasItems

jsonPath("$.data[?(@.id == 1)].places", hasItems(hasItems("Rome1", "London1")))
这样做是可行的,但这样做只会让我觉得我做得不对,我错过了一些东西

所以我的问题是,什么是处理检查/匹配列表的适当方法


是否有更好的方法验证端点返回的JSON?

我觉得原始编辑更清晰。还原了更改。如果可以将jsonpath表达式重新格式化为确定表达式而不是不确定表达式,那么应该更简单。然而,如果你不能做到这一点,那么我不确定是否有更好的选择。
jsonPath("$.data[?(@.id == 1)].places", hasItems(hasItems("Rome1", "London1")))