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(...);
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);
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);
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
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));
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
)
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);
}
Wenn Sie mit JsonPath nicht vertraut sind, würde ich die Verwendung einer Java-Serialisierung/Deserialisierung mit GSON oder Jackson vorschlagen.