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

在保证响应中迭代和验证 Json 数组中的值

严天逸
2023-03-14

我有一个放心的回复,其中包含以下正文:

{
   "content":[
      {
         "id":"7db80896",
         "secondaryId":"12F9BD",
         "version":1,
         "details":{
            "status":"VALID",
            "reason":"Passed validations"
         },
         "subscriptionStatuses":[
            {
               "subscriptionId":"b8003508",
               "subscriptionName":"Sub_1",
               "creator":"Person 1",
               "details":{
                  "status":"ACCEPTED",
                  "reason":"Passed validations"
               }
            },
            {
               "subscriptionId":"b8003509",
               "subscriptionName":"Sub_2",
               "creator":"Person 1",
               "details":{
                  "status":"ACCEPTED",
                  "reason":"Passed validations"
               }
            }
         ]
      },
      {
         "id":"7db80895",
         "secondaryId":"11F9BD",
         "version":1,
         "details":{
            "status":"VALID",
            "reason":"Passed validations"
         },
         "subscriptionStatuses":[
            {
               "subscriptionId":"b8003509",
               "subscriptionName":"Sub_2",
               "creator":"Person 2",
               "details":{
                  "status":"ACCEPTED",
                  "reason":"Passed validations"
               }
            }
         ]
      }
   ]
}

我想验证嵌套在2个数组中的状态“已接受”和原因“已通过验证”。我尝试将原因存储为列表,在此示例中进行了概述,但我收到以下错误:

代码: 变量列表: 列表

错误:java.lang.IllegalStateException:response.jsonPath()。getList(“reason”)不得为空

有没有办法做到:

for obj in response:
   for obj2 in obj.subscriptionStatuses:
      assertThat(obj2.status == expected)
      assertThat(obj2.reason == expected)

共有2个答案

况唯
2023-03-14

您可以使用以下代码获得它

List<String> m1 =response.jsonPath().get("content.subscriptionStatuses.details");
System.out.println(m1);

输出将显示[[{状态=接受,原因=通过验证},{状态=接受,原因=通过验证}],[{状态=接受,原因=通过验证}]]

佘飞鸣
2023-03-14

有一种方法:将响应反序列化为对象。创建与响应匹配的类。

例如

class Status {

  private String id;
  private String secondaryId;
  //etc.
  private StatusDetail details;
  private List<SubscriptionStatus> subscriptionStatuses;
}

…等等。我不知道这在静态编程语言中会是什么样子,但会很相似。

请注意,JSON响应中的嵌套对象是它们自己的类,每个类中的字段名应该与JSON中的字段名称匹配。

然后,您可以使用< code>ObjectMapper进行反序列化。您可能需要执行< code>response.jsonPath()。getList("$。content”)首先,但我不知道你的回应对象是什么,以提供比这更多的指导。更好的做法是,直接获取JSON字符串:

List<Status> statuses = new ObjectMapper().readValue(jsonString, 
  new TypeReference<List<Status>>() {})

请注意,您可以重复使用对象映射器,并且不应每次都创建一个新的对象映射器,并且对象映射器也有允许空值的选项。

 类似资料:
  • 我有一个与 Rest Assured 中的响应正文验证相关的问题。让我们假设,我有一个像json这样的响应体。 我需要检查: 如果图书部分包含儿童类型 如果一本儿童类书籍的自动名称为Eric 第一个断言可以是这样的: 但是我需要检查它的作者的名字是否是威廉。有没有办法使用jsonPath检查它? 我假设,我可以做反序列化(例如,x. List

  • 我有一个关于Rest保证的问题。-https://code.google.com/p/rest-assured/wiki/Usage 我知道我可以使用REST保证进行HTTP调用(. get. put等)。)并使用时()等验证响应。我想验证我已经保存在数据库中的JSON响应,而不是实时调用Web服务并验证它的响应。 我可以使用REST-保证加载JSON响应作为字符串并验证它吗?

  • 我得到的是HTML格式的endpoint响应,我需要验证标记中的某些json。HTML响应如下所示: 我想在json响应中验证以下内容: 和 如何实现?

  • 我试图断言Json响应在我的jmetm使用Beanshell断言。下面是我的代码。 下面是我必须验证的Json路径 运行脚本后,我得到以下脚本。 断言失败消息:org。阿帕奇。乔芬。util。JMeterException:调用bsh方法时出错:评估源文件:内联评估:``导入组织。json。JSONObject;导入组织。json。杰索纳雷;导入java。lang.String;…'':类型化变量

  • 我有一个返回JSON的endpoint,如下所示: 和DTO类: 现在,我用这种方法测试返回的json数组的长度: 但是,有没有什么方法可以在不强制转换到FooDto数组的情况下完成它?类似这样:

  • 我试图在Spring MVC Web服务返回的JSON结果中验证LocalDate对象,但我不知道如何验证。 目前,我总是遇到如下断言错误: java.lang.AssertionError: JSON路径" $[0]。“开始日期”应为:是 我的测试的重要部分发布在下面。任何想法如何修复测试以通过? webservice返回一个视图对象列表,如下所示: [编辑] 另一次尝试是 导致 java.la