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(...);
Ответы
Ответ 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.