在我的测试中,有如下响应:
{
"commands": [
{
"type": "com.our.identity.patch",
"value": [
{
"op": "add",
"path": "/claims/gTwfQubKEl4r",
"value": [
"vcvWxlsLKV35"
]
},
{
"op": "add",
"path": "/claims/Jmq6zrG7LKoJ",
"value": [
"iiMQoOWKu2OI"
]
}
]
}
]
}
其中 gTwfQubKEl4r
和 vcvWxlsLKV35
是键值对。
Jmq6zrG7LKoJ
和 iiMQoOWKu2OI
键值对相同。
响应可以包含许多键值对。
我需要能够验证响应中是否存在某些键和值。
我使用 restassured java
,所以我知道我可以使用 commands.value.path
之类的路径来获取密钥,并使用 commands.value.value
之类的路径来获取我编写的这些方法的值:
public String getValueFromResponseBody(Response res, String key){
return res.body().jsonPath().getString(key);
}
public void validateParameterValueInResponseBodyEquals(Response res, String param, String expectedValue){
String value = getValueFromResponseBody(res,param);
Assert.assertEquals(value,expectedValue);
}
传递的 param
是响应中的参数路径,如 commands.value.path
。
但是我认为这会给我带来与传递的路径匹配的响应正文中的第一个节点,而我需要检查与该路径匹配的响应中的所有节点。
可能吗?
答案 0 :(得分:1)
我认为这会给我带来响应正文中的第一个节点 匹配传递的路径,而我需要检查所有节点 在与该路径匹配的响应中
不,它得到所有匹配。由于commands
节点和value
节点都是数组,所以会产生一个list的list。
List<List<String>> lists = JsonPath.from(res).getList("commands.value.path");
[[/claims/gTwfQubKEl4r, /claims/Jmq6zrG7LKoJ]]
List<String> list = JsonPath.from(res).getList("commands[0].value.path")
[/claims/gTwfQubKEl4r, /claims/Jmq6zrG7LKoJ]
String str = JsonPath.from(res).getString("commands[0].value[0].path");
/claims/gTwfQubKEl4r
解决方案:
要在一个查询中获取所有 path
,您只需要制作 List<List<String>>
--> List<String>
。您可以在流中尝试 flatMap 或使用其他方式。
List<List<String>> lists = JsonPath.from(res).getList("commands.value.path");
List<String> flat = lists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
flat.forEach(System.out::println);
/claims/gTwfQubKEl4r
/claims/Jmq6zrG7LKoJ
还有一个选择:
您可以使用 JsonPath (com.jayway.jsonpath.JsonPath)
List<String> list = JsonPath.read(res, "$..path");
list.forEach(System.out::println);
/claims/gTwfQubKEl4r
/claims/Jmq6zrG7LKoJ