2014-02-12 35 views
12

我有一個POJO Artwork。我從JSON格式的HTTP響應正文中的REST風格的web服務中檢索這些對象的List。我正在嘗試編寫一個基於Rest Assured的測試來分析返回的列表。代碼如下所示:休息保證 - 將反應JSON反序列化爲列表<POJO>

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

的問題是,我不能讓放心解析返回的JSON作爲List<Artwork>。相反,我得到一個List<LinkedHashMap>。該地圖具有適當的結構,即可由傑克遜映射到Artwork對象,但我想避免手動映射它。

在我的模型JSON映射是確定的,因爲當我映射單個對象是這樣的:

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

它工作正常。

是否有可能獲得returnedArtworks作爲List<Artwork>

+0

回答下面的問題.. – Uttam

回答

16

你可以這樣做:

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

關鍵是要反序列化JSON對象的數組(因爲數組的JSON字符串或列表之間沒有區別) ,然後將數組轉換爲列表。

+0

您應該爲解決方案向其他找到此問題的人員添加說明。 –

+0

謝謝,我添加了一個簡短的解釋(並更正了一個錯誤)。 – volatilevar

+0

現在無法檢查,但假設所有來自發現此解決方案的用戶的upvotes都很有用,我將其標記爲接受的答案 – Wojtek

1

通過使用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 
+0

謝謝你的答案。儘管這正是我想要避免的:「地圖有一個合適的結構,即可以由傑克遜映射到Artwork對象,但我想避免手動映射它。」 我在想是否有機會這樣做:'List returnedArtArt = = response.getBody()。asListOf(Artwork.class)' – Wojtek

+0

如果您的作品類與您收到的地圖完全匹配迴應,你可以使用Gson而不是Jackson。您可以重複使用相同的作品類。 – Uttam

+0

無論我使用Gson還是Jackson,這並不重要。在任何一種情況下,我都必須編寫額外的代碼行來解析收到的地圖。我希望Rest Assured以某種方式實施,因爲我們經常收到一個「List」對象。 – Wojtek

2

這個解決方案適用於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" } 
] 
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