Подтвердить что ты не робот

REST Assured - десериализация универсального списка

Скажем, у меня есть класс Java Person:

class Person {
    String name;
    String email;
}

С помощью REST Assured вы можете десериализовать этот объект JSON

{"name":"Bob", "email":"[email protected]"} 

для экземпляра Java Person, используя

Person bob = given().when().get("person/Bob/").as(Person.class);

Как использовать REST Assured для десериализации этого массива JSON

[{"name":"Bob", "email":"[email protected]"}, 
 {"name":"Alice", "email":"[email protected]"}, 
 {"name":"Jay", "email":"[email protected]"}]

в a List<Person>? Например, это было бы удобно:

List<Person> persons = given().when().get("person/").as(...);
4b9b3361

Ответ 1

Я нашел способ добиться того, что хотел:

List<Person> persons = given().when().get("person/").as(Person[].class);

ОБНОВЛЕНИЕ: Использование Rest-Assured 1.8.1 выглядит так, что функция cast to List больше не поддерживается. Вам нужно объявить массив объектов следующим образом:

Person[] persons = given().when().get("person/").as(Person[].class);

Ответ 2

для тех, кто узнал, что принятый ответ больше не работает.

    List<Entity> list = new ArrayList<>();
    list = given()
            .contentType(CONTENT_TYPE)
        .when()
            .get(getRestOperationPath())
        .then()
            .extract().body().as(list.getClass());

надеюсь, вы понимаете, что getRestOperationPath возвращает путь операции отдыха; и CONTENT_TYPE является заполнителем для вашего типа контента (например, application/json)

upd: проверил разные версии, поведение отличается в зависимости от версии, поэтому вы можете попробовать разные подходы

upd2: более чистое решение было отмечено @Arigion в комментариях:

to use .extract().body().jsonPath().getList(".", Entity.class);

Ответ 3

Вы могли бы также сделать это, если бы вас заинтересовали использование функции "ожидать()"

expect().
 body("get(0).firstName", equalTo("Mike")).
when().
 get("person/");

Это был мой случай

Ответ 4

Если кто-то еще ищет. Используя Java 1.8 и RestAssured 2.9, решение действительно простое и не выдает "Unchecked Warning".

return Arrays.asList(given()
            .when()
            .get("restPath")
            .then()
            .extract()
            .response()
            .body()
            .as(Player[].class));

Ответ 5

Чтобы извлечь список Java, а не Array, из ответа JSON API, вам просто нужно помнить использовать jsonPath а не as:

List<Person> persons = given()
        .when()
        .get("/person")
        .then()
        .extract()
        .body()
        // here the magic
        .jsonPath().getList(".", Person.class);

Ваш путь json может указывать на то место, где вы ожидаете, что в вашем теле будет список объектов json. в этом примере (и работает на ваш вопрос) он просто указывает на корень json.

sidenode: будьте уверены, внутренне использует Джексона для десериализации (для .jsonPath а также .as)

Ответ 6

Если вам не нравится JsonPath, я бы предложил использовать любую сериализацию/десериализацию java с использованием GSON или Jackson.