Как искать в анонимном и вложенном массиве с помощью find или findAll в замыканиях Groovy с использованием библиотеки REST-Assured?

У меня есть анонимное тело ответа JSON, и мне нужно динамически анализировать вложенные массивы, чтобы получить значение ключа на основе условия, используя find или findAll в замыканиях Groovy

[
{
  "children": [
    {
      "attr": {
        "reportId": "1",
        "reportShortName": "ABC",
        "description": "test,
      }
    },
   {
     "attr": {
       "reportId": "2",
       "reportShortName": "XYZ",
       "description": "test",
      }
   }
}
]

Я пробовал следующие способы, и мне не удалось получить значение ключа reportId из ответа JSON.

package com.src.test.api;
import static io.restassured.RestAssured.given;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;

public class GetReportId {
   public void getReportId(String reportName) throws Exception {
    String searchReports = "http://localhost:8080/reports";
    Response resp=given().request().when().get(searchReports).then().extract().response();
    JsonPath jsonPath = new JsonPath(resp.asString());

    String reportId1 =jsonPath.get("$.find{it.children.contains(restAssuredJsonRootObject.$.children.find{it.attr.reportShortName == 'ABC'})}.attr.reportId");
    String reportId2 = jsonPath.get("$.find{it.children.attr.reportShortName.contains(restAssuredJsonRootObject.$.children.find{it.attr.reportShortName.equals('XYZ')}.attr.reportShortName)}.attr.reportId");
    System.out.println("ReportId: " + reportId1);
  }
}

В родительском анонимном массиве может быть несколько объектов JSON, и для получения reportId необходимо использовать find или findAll в классных замыканиях.

Нужно получить reportId, но вроде что-то не так. Любая помощь будет оценена.


person Raj    schedule 06.06.2019    source источник
comment
По какой причине вы не можете использовать собственные инструменты Groovy JSON? new JsonSlurper().parseText(jsonText)*.children*.attr*.findAll{it.reportShortName=='ABC'}*.reportId.flatten()   -  person hsan    schedule 06.06.2019
comment
Спасибо! Не совсем так, как мы пытаемся придерживаться REST-гарантированных библиотек в соответствии с фреймворком.   -  person Raj    schedule 25.06.2019


Ответы (1)


Предполагая, что вам нужны все идентификаторы отчетов

List<String> reportIds = jsonPath.get("children.flatten().attr.reportId");

даст вам то, что вы хотите, даже если родительский анонимный массив имеет несколько записей.

Я тестировал следующий JSON

[
  {
    "children": [
      {
        "attr": {
          "reportId": "1",
          "reportShortName": "ABC",
          "description": "test"
        }
      },
      {
        "attr": {
          "reportId": "2",
          "reportShortName": "XYZ",
          "description": "test"
        }
      }
    ]
  },
  {
    "children": [
      {
        "attr": {
          "reportId": "3",
          "reportShortName": "DEF",
          "description": "test"
        }
      },
      {
        "attr": {
          "reportId": "4",
          "reportShortName": "IJK",
          "description": "test"
        }
      }
    ]
  }
]

и он дает мне ["1", "2", "3", "4"], т.е. reportIds от всех детей

Если вы знаете индекс искомого reportId, вы можете использовать его так:

String reportId = jsonPath.get("children.flatten().attr.reportId[0]");

Если вы ищете reportId определенного отчета, вы тоже можете это сделать:

String reportId = jsonPath.get("children.flatten().attr.find{it.reportShortName == 'ABC'}.reportId")

даст вам "1".

Примечание. Тип переменной, которой вы назначаете результаты, важен для вывода типов и преобразования типов. Например, вы НЕ МОЖЕТЕ:

String [] reportIds = jsonPath.get("children.flatten().attr.reportId");

or

int reportId = jsonPath.get("children.flatten().attr.reportId[0]");

Обе эти вещи вызовут исключение ClassCastException.

person riyasvaliya    schedule 16.08.2019