Rest Assured - 将响应JSON反序列化为List <POJO>

Woj*_*tek 20 java generics json rest-assured

我有一个POJO Artwork.我正在List以JSON格式从HTTP响应主体中的RESTful Web服务中检索这些对象中的一个.我正在尝试编写一个基于Rest Assured的测试来分析返回的列表.代码如下所示:

Response response = get("/artwork");
List returnedArtworks = response.getBody().as(List.class)
Run Code Online (Sandbox Code Playgroud)

问题是,我无法让Rest Assured将返回的JSON解析为List<Artwork>.相反,我得到了一个List<LinkedHashMap>.地图有一个合适的结构,即可以由Jackson映射到Artwork对象,但我想避免手动映射它.

我的模型中的JSON映射是可以的,因为当我像这样映射单个对象时:

Artwork returnedArtwork = response.getBody().as(Artwork.class);
Run Code Online (Sandbox Code Playgroud)

它工作正常.

是否有可能returnedArtworks成为List<Artwork>

vol*_*var 22

你可以这样做:

List<Artwork> returnedArtworks = Arrays.asList(response.getBody().as(Artwork[].class));
Run Code Online (Sandbox Code Playgroud)

诀窍是将JSON反序列化为对象数组(因为数组的JSON字符串或列表之间没有区别),然后将数组转换为列表.


小智 8

此解决方案适用于版本 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);
Run Code Online (Sandbox Code Playgroud)

这将为这样的结构提取对象:

public class Order {

private String id;

public String getId(){
return id; }

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


}
Run Code Online (Sandbox Code Playgroud)

使用给定的 json:

[ 
{ "id" : "5" }, 
{ "id" : "6" }
]
Run Code Online (Sandbox Code Playgroud)


Pur*_*ham 5

通过使用 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
Run Code Online (Sandbox Code Playgroud)