web-dev-qa-db-fra.com

REST Assured - Désérialisation de liste générique

Disons que j'ai une classe Java Person:

class Person {
    String name;
    String email;
}

Avec REST Assured, vous pouvez désérialiser cet objet JSON.

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

à une instance Java Person à l'aide de

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

Comment utilise-t-on REST Assured pour désérialiser ce tableau JSON

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

dans un List<Person>? Par exemple, cela serait pratique:

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

J'ai trouvé un moyen de réaliser ce que je voulais:

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

UPDATE: Utilisation de Rest-Assured 1.8.1, on dirait que la conversion en liste n'est plus prise en charge. Vous devez déclarer et objecter un tableau comme ceci:

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

pour ceux qui ont découvert que la réponse acceptée ne fonctionne plus.

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

si tout va bien, vous comprenez que getRestOperationPath renvoie le chemin d'opération de repos; et CONTENT_TYPE est un espace réservé pour votre type de contenu (application/json par exemple)

upd: a vérifié différentes versions, le comportement diffère selon la version, vous pouvez donc essayer différentes approches

upd2: cleaner solution a été pointé par @Arigion dans les commentaires:

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

Vous pouvez également le faire si vous êtes intéressé par "expect ()"

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

C'était mon cas

6
allegjdm93

Si quelqu'un cherche encore ... à l'aide de Java 1.8 et de RestAssured 2.9 .__, la solution est très simple et ne lance pas "Avertissement non contrôlé.

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

Pour extraire une liste Java, et non un tableau, d'une réponse d'API JSON, vous devez simplement vous rappeler d'utiliser jsonPath plutôt que as:

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

Votre chemin JSON peut pointer n'importe où vous attendez une liste d'objets JSON dans votre corps. dans cet exemple (et travaillant pour votre question), il pointe simplement sur la racine JSON.

sidenode: reste-assuré utilise en interne jackson pour la désérialisation (pour .jsonPath ainsi que .as

4
Christian Dräger

Cela serait utile, fonctionne avec la version actuelle de repos assuré.

@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

Si vous n'êtes pas à l'aise avec JsonPath, je vous suggérerais d'utiliser une sérialisation/désensualisation Java utilisant GSON ou Jackson.

0