it-swarm.com.de

REST Assured - Generische List Deserialisierung

Nehmen wir an, ich habe eine Java-Klasse Person:

class Person {
    String name;
    String email;
}

Mit REST Assured können Sie dieses JSON-Objekt deserialisieren

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

zu einer Java Person-Instanz mit

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

Wie verwendet man REST Assured, um dieses JSON-Array zu deserialisieren

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

in einen List<Person>? Das wäre zum Beispiel praktisch:

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

Ich habe einen Weg gefunden, um das zu erreichen, was ich wollte:

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

UPDATE: Wenn Sie Rest-Assured 1.8.1 verwenden, wird die Umwandlung in Liste nicht mehr unterstützt. Sie müssen ein Objektarray wie folgt deklarieren:

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

für diejenigen, die herausgefunden haben, dass die akzeptierte Antwort nicht mehr funktioniert.

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

hoffentlich verstehen Sie, dass getRestOperationPath den Restoperationspfad zurückgibt. und CONTENT_TYPE ist ein Platzhalter für Ihren Inhaltstyp (beispielsweise application/json).

upd: Verschiedene Versionen geprüft, Verhalten je nach Version unterschiedlich, daher sollten Sie verschiedene Ansätze ausprobieren

upd2: Cleaner Solution wurde von @Arigion in Kommentaren gezeigt:

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

Sie können dies auch tun, wenn Sie Interesse an "Expect ()" haben.

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

Das war mein Fall

6
allegjdm93

Wenn noch jemand nach etwas sucht . Mit Java 1.8 und RestAssured 2.9 Ist die Lösung wirklich einfach und es wird keine "Unchecked Warning" ausgelöst.

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

Um eine Java-Liste und nicht ein Array aus einer JSON-API-Antwort zu extrahieren, müssen Sie lediglich jsonPath anstelle von as verwenden:

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

Ihr Json-Pfad kann auf eine Stelle zeigen, an der Sie eine Liste mit Json-Objekten in Ihrem Körper erwarten. In diesem Beispiel (und für Ihre Frage) zeigt es nur auf die Json-Wurzel.

sidenode: Rest-Assured verwendet intern Jackson zur Deserialisierung (für .jsonPath sowie .as

4

Dies wäre hilfreich, funktioniert mit der aktuellen Version von restgesichert.

@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

Wenn Sie mit JsonPath nicht vertraut sind, würde ich die Verwendung einer Java-Serialisierung/Deserialisierung mit GSON oder Jackson vorschlagen.