web-dev-qa-db-ja.com

REST Assured-Generic List deserialization

Java Personクラスがあるとしましょう:

class Person {
    String name;
    String email;
}

REST Assuredを使用すると、このJSONオブジェクトをデシリアライズできます

{"name":"Bob", "email":"[email protected]"} 

Java Personインスタンスを使用して

Person bob = given().when().get("person/Bob/").as(Person.class);

RESTこのJSON配列をデシリアライズすることを保証する方法

[{"name":"Bob", "email":"[email protected]"}, 
 {"name":"Alice", "email":"[email protected]"}, 
 {"name":"Jay", "email":"[email protected]"}]

List<Person>?たとえば、これは便利です。

List<Person> persons = given().when().get("person/").as(...);
41
spg

私が望んでいたことを達成する方法を見つけました:

List<Person> persons = given().when().get("person/").as(Person[].class);

PDATE: Rest-Assured 1.8.1を使用すると、リストへのキャストはサポートされなくなります。次のようなオブジェクト配列を宣言する必要があります。

Person[] persons = given().when().get("person/").as(Person[].class);
50
spg

受け入れられた答えがもう機能しないことがわかった人のために。

    List<Entity> list = new ArrayList<>();
    list = given()
            .contentType(CONTENT_TYPE)
        .when()
            .get(getRestOperationPath())
        .then()
            .extract().body().as(list.getClass());

うまくいけば、getRestOperationPathが残りの操作パスを返していることを理解できます。 CONTENT_TYPEはコンテンツタイプのプレースホルダーです(例:application/json)

upd:異なるバージョンをチェック、動作はバージョンによって異なるため、異なるアプローチを試してください

upd2:cleaner solutionは@Arigionによってコメントで指摘されました:

to use .extract().body().jsonPath().getList(".", Entity.class);
16

JSON APIレスポンスからJavaリストではなく配列)を抽出するには、jsonPathではなくasを使用することを忘れないでください:

List<Person> persons = given()
        .when()
        .get("/person")
        .then()
        .extract()
        .body()
        // here's the magic
        .jsonPath().getList(".", Person.class);

あなたのjsonパスは、あなたの体の中にjsonオブジェクトのリストがあると予想される場所を指すことができます。この例では(そしてあなたの質問に取り組んで)jsonルートを指し示しています。

sidenode:rest-assuredは内部的に逆シリアル化にjacksonを使用しています(.jsonPath と同様 .as

7

「expect()」の使用に興味がある場合にもこれを行うことができます

expect().
 body("get(0).firstName", equalTo("Mike")).
when().
 get("person/");

これは私の場合でした

6
allegjdm93

まだ探している人がいるなら。 Java 1.8およびRestAssured 2.9を使用すると、ソリューションは非常に簡単になり、「未確認の警告」がスローされません。

return Arrays.asList(given()
            .when()
            .get("restPath")
            .then()
            .extract()
            .response()
            .body()
            .as(Player[].class));
5
Kristijan Rusu

これは役立つでしょう、安心の現在のバージョンで動作します。

@Test
    public void apostUser() {
        Map<String,String> user = new HashMap<>();
        user.put("User_Id", "xyx1111");
        user.put("First_Name", "KS");
        user.put("Designation", "DR");

        given()
        .contentType("application/json")
        .body(user)
        .when().post("URI").then()
        .statusCode(200);
    }
0
krishna

JsonPathに慣れていない場合は、GSONまたはJacksonを使用して任意のJavaシリアライゼーション/デシリアライゼーションを使用することをお勧めします。