在RestAssured响应中迭代并验证Json数组中的值

问题描述 投票:0回答:2

我有一个包含以下内容的身体放心的回复:

{
   "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"
               }
            }
         ]
      }
   ]
}

我想验证状态“ ACCEPTED”,并说明嵌套在2个数组中的原因“ PASSED VALIDATIONS”。我尝试将原因存储为列表,在此example中列出,但出现以下错误:

代码:var list: List<Any> = response.jsonPath().getList("reason")

错误:java.lang.IllegalStateException: response.jsonPath().getList("reason") must not be null

有办法吗?

for obj in response:
   for obj2 in obj.subscriptionStatuses:
      assertThat(obj2.status == expected)
      assertThat(obj2.reason == expected)
java json kotlin assert rest-assured
2个回答
0
投票

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

例如

class Status {

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

...等等。我不知道这在Kotlin中会是什么样,但是会很相似。

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

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

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

请注意,您可以重复使用ObjectMapper,并且不应每次都创建一个新的C0,并且ObjectMapperallow null values都有一些选项。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.