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

pkln4tw6  于 2023-08-08  发布在  其他
关注(0)|答案(6)|浏览(134)

我有一个POJO Artwork。我从一个RESTful Web服务中以JSON格式在HTTP响应体中检索这些对象的List。我正在尝试编写一个基于Rest Assured的测试,该测试将分析返回的列表。代码看起来像这样:

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

字符串
问题是,我无法让Rest Assured将返回的JSON解析为List<Artwork>。我得到了一个List<LinkedHashMap>。该图具有适当的结构,即可以由JacksonMap到Artwork对象,但我希望避免手动Map它。
我的模型中的JSONMap是可以的,因为当我像这样Map单个对象时:

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


很好用。
有可能得到returnedArtworks作为List<Artwork>吗?

vyu0f0g1

vyu0f0g11#

你可以这样做:

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

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

9ceoxa92

9ceoxa922#

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

50few1ms

50few1ms3#

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

字符串

tzdcorbm

tzdcorbm4#

放心提供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's answer所指出的,可以使用TypeToken。我更喜欢直接在rest-assured中使用它:

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)

6yoyoihd

6yoyoihd5#

使用RESTassured 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

eivnm1vs

eivnm1vs6#

目前,我们有一个更好的解决方案,使用Typeref,这将有助于提取通用对象

List<Artwork> returnedArtworks = response.getBody().as(new TypeRef<List<Artwork>>() {});

字符串
或者是

response.as(new TypeRef<List<Artwork>>() {});

相关问题