放心响应-验证匹配相同路径的节点

c0vxltue  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(414)

在我的测试中,a的回答如下:

{
    "commands": [
        {
            "type": "com.our.identity.patch",
            "value": [
                {
                    "op": "add",
                    "path": "/claims/gTwfQubKEl4r",
                    "value": [
                        "vcvWxlsLKV35"
                    ]
                },
                {
                    "op": "add",
                    "path": "/claims/Jmq6zrG7LKoJ",
                    "value": [
                        "iiMQoOWKu2OI"
                    ]
                }
            ]
        }
    ]
}

哪里 gTwfQubKEl4rvcvWxlsLKV35 是键值对。
同样 Jmq6zrG7LKoJiiMQoOWKu2OI 键值对。
响应可以包括许多键值对。
我需要能够验证响应中是否显示了一些键和值。
我用 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 .
但我认为这将为我带来响应体中匹配传递路径的第一个节点,同时我需要检查响应体中匹配该路径的所有节点。
可能吗?

jtjikinw

jtjikinw1#

我认为这将为我带来响应体中与传递路径匹配的第一个节点,同时我需要检查响应体中与该路径匹配的所有节点
不,它得到了所有的匹配。自从 commands 节点与 value 节点都是数组,因此它将生成列表的列表。

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

相关问题