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