Извлечение вложенного значения из ответа Rest Assured

Мне нужно извлечь и / или подтвердить значения в «полях» (например, «согласие», «количество отказов») в следующем теле ответа json:

{
"next": null,
"previous": null,
"results": [
    {
        "huid": "be7d-794186bda2d3",
        "name": null,
        "language": "eng",
        "arns": [
            "doodle:123456"
        ],
        "groups": [],
        "fields": {
            "consent": "TRUE",
            "failure_count": 2,
            "timestamp": "2020-04-17T12:04:04.978887Z",
            "registration_type": "normal"
        },
        "blocked": false,
        "stopped": false,
        "created_on": "2020-04-17T12:04:04.978887Z",
        "modified_on": "2020-04-17T12:04:05.692949Z"
    }
]

}


person Randall Brukman    schedule 20.04.2020    source источник
comment
что ты уже испробовал?   -  person Fenio    schedule 20.04.2020


Ответы (2)


Если вы ожидаете результата в виде массива, вы можете создать класс pojo. Например:

public class ExampleResponse {
    private Object next;
    private Object previous;
    private Result[] results;

    //add getters and setters

    public class Result {
        private String huid;
        private String name;

        //add getters and setters
    }
}

а затем преобразуйте свой ответ json в объект java

ExampleResponse pojo = given()
    .when().get(endpoint)
    .then().extract().body().as(ExampleResponse.class);

после этой манипуляции вы можете извлечь и / или подтвердить любое поле. Например:

...
results[0].isBlocked();
...

Также вы можете попробовать извлечь значение полей с помощью метода пути:

...
given()
    .when().get(endpoint)
    .path("results[0].arns[0]");

...

given()
    .when().get(endpoint)
    .path("results[0].fields.timestamp");
...

Если вы ожидали обычного json (без результатов в виде массива), вы можете использовать следующие методы:

//assert value
given()
    .when().get(endpoint)
    .then()
    .assertThat()
    .body("result.name", equalTo(someName));

//assert response has or not parameter
given()
    .when().get(endpoint)
    .then()
    .body("results", hasKey("name"))
    .body("results", not(hasKey("name")));

Дополнительные примеры см. На странице использования. И это описание тоже может быть полезно! Надеюсь на эту помощь!

person Akane    schedule 22.04.2020

Вы можете преобразовать тело ответа в jsonpath. После преобразования в jsonpath вы можете использовать приведенный ниже код, чтобы получить значение «согласия», «счетчик отказов».

JsonPath responseJsonPath = new JsonPath(jsonString) 
String consent = responseJsonPath.getString("results[0].fields.consent");
int failureCount = responseJsonPath.getInt("results[0].fields.failure_count");

Я считаю, что вы получаете ValidatableResponse от API. Пожалуйста, дайте мне знать, если у вас возникнут проблемы.

person Rajesh Chaudhary    schedule 27.04.2020