29

我有一个 POJO Artwork。我正在List从 JSON 格式的 HTTP 响应正文中的 RESTful Web 服务中检索这些对象中的一个。我正在尝试编写一个基于 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);

它工作正常。

有可能得到returnedArtworksasList<Artwork>吗?

4

5 回答 5

36

你可以这样做:

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

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

于 2014-08-03T13:32:35.173 回答
10

此解决方案适用于 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" }
]
于 2017-03-29T09:18:55.460 回答
4

通过使用 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
于 2014-02-12T12:34:20.160 回答
2

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

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

在我看来,type变量的方式取决于所使用的序列化库。


如果使用 Gson,正如Purushotham 的回答所指出的那样,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)
于 2019-08-06T10:25:34.470 回答
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 转换为列出更多示例来避免代码的复杂性,如何检查响应内容可以找到链接

于 2017-05-05T10:13:53.743 回答