56

假设我有一个 JavaPerson类:

class Person {
    String name;
    String email;
}

使用 REST Assured,您可以反序列化此 JSON 对象

{"name":"Bob", "email":"bob@email.com"} 

使用 JavaPerson实例

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

如何使用 REST Assured 反序列化这个 JSON 数组

[{"name":"Bob", "email":"bob@email.com"}, 
 {"name":"Alice", "email":"alice@email.com"}, 
 {"name":"Jay", "email":"jay@email.com"}]

变成一个List<Person>?例如,这会很方便:

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

9 回答 9

69

我找到了一种方法来实现我想要的:

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

更新:使用 Rest-Assured 1.8.1,看起来不再支持强制转换为 List。您需要像这样声明和对象数组:

Person[] persons = given().when().get("person/").as(Person[].class);
于 2013-03-22T17:53:13.480 回答
24

对于那些发现接受的答案不再起作用的人。

    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:@Arigion 在评论中指出了更清洁的解决方案:

to use .extract().body().jsonPath().getList(".", Entity.class);
于 2016-09-20T08:14:03.273 回答
22

要从 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:放心在内部使用jackson进行反序列化(for.jsonPath以及.as

于 2018-10-26T10:17:25.450 回答
10

如果您对使用“expect()”感兴趣,也可以这样做

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

这是我的情况

于 2013-05-14T15:42:18.247 回答
9

我们现在可以TypeRef尽可能多地使用 JsonPath 库:

List<Person> persons = given().when().get("person/")
    .as(new TypeRef<List<Person>>() {});

https://github.com/json-path/JsonPath#what-is-returned-when一样- 匿名内部类new TypeRef<List<Person>>() {}绕过类型擦除并捕获足够的类型信息以使框架可以访问原始类型 -List在这种情况下. 内部泛型类型 - Person- 是可以在特定情况下进行的安全转换。

于 2021-03-24T18:43:16.693 回答
7

如果有人还在找。使用 Java 1.8 和 RestAssured 2.9 解决方案非常简单,并且不会引发“未经检查的警告”。

return Arrays.asList(given()
            .when()
            .get("restPath")
            .then()
            .extract()
            .response()
            .body()
            .as(Player[].class));
于 2018-05-10T11:57:28.360 回答
0

如果您对 JsonPath 不满意,我建议您使用任何使用 GSON 或 Jackson 的 java 序列化/反序列化。

于 2018-03-14T05:53:39.003 回答
-1

这将很有帮助,适用于当前版本的放心。

@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);
    }
于 2018-12-16T07:19:19.323 回答
-1

既然你想映射

[{"name":"Bob", "email":"bob@email.com"}, 
 {"name":"Alice", "email":"alice@email.com"}, 
 {"name":"Jay", "email":"jay@email.com"}]

到java对象。

现在在调用端点时,您可以直接映射到 Person 列表,如下所示

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

注意 Person 类应该保持不变,即不需要对 person 类做任何修改。

public class Person{
 String name;
 String email;
}
于 2021-02-03T16:07:29.297 回答