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

时间:2014-02-12 10:24:24

标签: java json generics rest-assured

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

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

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

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

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

它工作正常。

是否可以将returnedArtworks作为List<Artwork>

5 个答案:

答案 0 :(得分:19)

你可以这样做:

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

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

答案 1 :(得分:3)

此解决方案适用于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" }
]

答案 2 :(得分:2)

通过使用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

答案 3 :(得分:0)

使用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转换为列出更多示例来避免代码的复杂性。如何检查响应内容可以找到link

答案 4 :(得分:0)

请放心,请在问题中使用Class的版本旁边提供as(java.lang.reflect.Type)

java.lang.reflect.Type type; //TODO defines the type.
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)

我认为type变量的方式取决于所使用的序列化库。


Purushotham's answer所述,如果使用Gson,则可以使用TypeToken。我更喜欢直接使用它来放心:

Type type = new TypeToken<List<Artwork>>(){}.getType();
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)

使用Jackson时,解决方案是使用TypeFactoryjavadocsource)来告知应将其反序列化为哪种类型:

Type type = TypeFactory.defaultInstance().constructCollectionLikeType(ArrayList.class, Artwork.class);
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)