Rest Assured - deserialize Response JSON as List <POJO>

У меня есть POJO Artwork. Я извлекаю List из этих объектов из веб-службы RESTful в тело ответа HTTP в формате JSON. Я пытаюсь написать тест на основе Rest Assured, который будет анализировать возвращенный список. Код выглядит следующим образом:

Response response = get("/artwork");
List returnedArtworks = response.getBody().as(List.class)

Проблема в том, что я не могу получить Rest Assured для анализа возвращаемого JSON как List<Artwork>. Вместо этого я получаю List<LinkedHashMap>. Карта имеет правильную структуру, то есть может быть сопоставлена ​​Джексоном с объектом Artwork, но я бы хотел избежать ее сопоставления вручную.

Отображения JSON в моей модели в порядке, потому что когда я сопоставляю один объект следующим образом:

Artwork returnedArtwork = response.getBody().as(Artwork.class);

он отлично работает.

Можно ли получить returnedArtworks как List<Artwork>?

Ответ 1

Вы можете сделать это:

List<Artwork> returnedArtworks = Arrays.asList(response.getBody().as(Artwork[].class));

Трюк заключается в десериализации JSON в массив объектов (потому что нет никакой разницы между строкой JSON массива или списком), а затем преобразовать массив в список.

Ответ 2

это решение работает для версии 3.0.2 (io.restassured):

  JsonPath jsonPath = RestAssured.given()
     .when()
     .get("/order")
     .then()
     .assertThat()
     .statusCode(Response.Status.OK.getStatusCode())
     .assertThat()
     .extract().body().jsonPath();

  List<Order> orders = jsonPath.getList("", Order.class);

Это приведет к извлечению объектов для такой структуры:

public class Order {

private String id;

public String getId(){
return id; }

public void setId(String id){
this.id = id;
}


}

с данным json:

[ 
{ "id" : "5" }, 
{ "id" : "6" }
]

Ответ 3

Используя библиотеку Google Gson, вы можете легко проанализировать ее до List<Artwork>. Попробуйте под кодом

Gson gson = new Gson();
List<Artwork> returnedArtworks = gson.fromJson(jsonStr, new TypeToken<List<Artwork>>(){}.getType());

//* where jsonStr is the response string(Json) receiving from your Restful webservice

Ответ 4

Если REST заверил 3.0.2, вы можете просто проверить, существует ли контент в массиве

when().get("/artwork").then().body("artworks", hasItem("some art");
//or check multiple values in array
when().get("/artwork").then().body("artworks", hasItems("some art", "other art");

Таким образом, вы избежите сложностей в своем коде, преобразовывая JSON, чтобы отобразить больше примеров, как можно проверить содержимое ответа ссылка