当前位置: 首页 > 知识库问答 >
问题:

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

越学博
2023-03-14

在我的测试中,a有这样的回答:

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

其中gTwfQubKEl4rvcvWxlsLKV35是键-值对。
关于Jmq6zrG7LKoJiiMQoOWKu2OIkey-value对也是如此。
响应可以包括许多键-值对。
我需要能够验证是否在响应中提供了一些键和值。
我使用rest在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);
}

其中传递的< code>param是响应中的参数路径,如< code>commands.value.path。< br >但是我认为这将为我带来响应正文中匹配传递路径的第一个节点,而我需要检查响应中匹配该路径的所有节点。< br >可能吗?

共有1个答案

孟跃
2023-03-14

我认为这会给我带来响应主体中匹配传递路径的第一个节点,而我需要检查响应中匹配该路径的所有节点

不,它得到了所有匹配。由于< code >命令节点和< code >值节点都是数组,所以它会产生一个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

解决方案:

要获取一个查询中的所有路径,您只需制作List

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

多一个选择:

可以使用JSON path(com . jayway . JSON path . JSON path)

List<String> list = JsonPath.read(res, "$..path");
list.forEach(System.out::println);
/claims/gTwfQubKEl4r
/claims/Jmq6zrG7LKoJ

 类似资料:
  • 我有一个示例JSON响应 如何验证何时然后当然后 尝试过类似的东西,但它不起作用。 我错过了什么还是做错了什么?

  • 给定: 响应体json是: 使用上面的代码,当执行最后一个断言时,它将故意失败,并且以下任何操作都不会被执行。我试图做的是从响应的主体中测试多个值,但不要在一开始就停止失败,如何放心地完成此操作? 正在引发的异常:

  • 放心,当我们这样做时 抛出的错误总是连续的,也就是说,如果状态代码失败,它不会检查contentType是否是JSON。 此外,抛出的错误始终是,断言错误(预期:200,实际:404)。无法从中了解实际响应是什么,如果启用日志记录,它将打印在标准输出上,但其他任何方式都不可用。 是否有任何方法来构建或设置类似于我们如何实现<code>过滤器 我有一个 rest api 框架,其中大多数验证都是使用

  • 我是大一新生,请放心。我有一个获取响应体的简单测试,我想验证响应体是否与我的POJO类匹配。 这是我的测试: 这是我的POJO类: 那么如何验证响应体结构等于我的POJO类呢? 提前感谢

  • 这些配置允许你对许多与URL映射和路径匹配有关的设置进行定制。关于所有可用的配置选项,请参考PathMatchConfigurer类的API文档。 下面是采用MVC Java编程配置的一段代码: @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter {

  • 如何从下面的json响应获得关键organization.email的值 这是放心使用的testng代码。 字符串变量值的值在ide控制台中显示为空。在许多json path在线网站中验证了 json路径,并且它是正确的。但键值打印为空