我有一个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>
?
答案 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时,解决方案是使用TypeFactory
(javadoc,source)来告知应将其反序列化为哪种类型:
Type type = TypeFactory.defaultInstance().constructCollectionLikeType(ArrayList.class, Artwork.class);
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)