web-dev-qa-db-ja.com

Rest Assured-レスポンスJSONをリストとしてデシリアライズします<POJO>

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);

それは正常に動作します。

returnedArtworksList<Artwork>として取得することはできますか?

23
Wojtek

あなたはこれを行うことができます:

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

トリックは、JSONをオブジェクトの配列に逆シリアル化して(配列またはリストのJSON文字列に違いがないため)、配列をリストに変換することです。

25
volatilevar

このソリューションはバージョン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" }
]
4
Seren

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
Purushotham

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

0
Vytautas

安心して 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を使用している場合は、TypeTokenを使用できます。私は安心して直接それを使用することを好みます:

Type type = new TypeToken<List<Artwork>>(){}.getType();
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)

ジャクソンを使用する場合の解決策は、TypeFactoryjavadocsource )を使用して、逆シリアル化する必要がある型を指定することです。

Type type = TypeFactory.defaultInstance().constructCollectionLikeType(ArrayList.class, Artwork.class);
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)
0
Jmini