REST Assured - 通用列表反序列化

spg*_*spg 43 java arrays json deserialization rest-assured

假设我有一个Java Person类:

class Person {
    String name;
    String email;
}
Run Code Online (Sandbox Code Playgroud)

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

{"name":"Bob", "email":"bob@email.com"} 
Run Code Online (Sandbox Code Playgroud)

使用的Java Person实例

Person bob = given().when().get("person/Bob/").as(Person.class);
Run Code Online (Sandbox Code Playgroud)

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

[{"name":"Bob", "email":"bob@email.com"}, 
 {"name":"Alice", "email":"alice@email.com"}, 
 {"name":"Jay", "email":"jay@email.com"}]
Run Code Online (Sandbox Code Playgroud)

变成了List<Person>?例如,这将是方便的:

List<Person> persons = given().when().get("person/").as(...);
Run Code Online (Sandbox Code Playgroud)

spg*_*spg 53

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

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

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

Person[] persons = given().when().get("person/").as(Person[].class);
Run Code Online (Sandbox Code Playgroud)


And*_*kov 17

对于那些发现接受的答案不再有效的人.

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

希望你明白getRestOperationPath正在返回rest操作路径; 和CONTENT_TYPE是您的内容类型的占位符(例如application/json)

upd:检查了不同的版本,行为因版本而异,所以您可能想尝试不同的方法

upd2:@Arigion在评论中指出了更清洁的解决方案:

to use .extract().body().jsonPath().getList(".", Entity.class);
Run Code Online (Sandbox Code Playgroud)

  • 最好使用.extract().body().jsonPath().getList(".",Entity.class); 否则你会得到一个未经检查的警告. (5认同)
  • 这应该是正确的答案.干净,简单,最新的响应. (2认同)

Chr*_*ger 9

要从JSON API响应中提取Java列表而不是数组,您只需记住要使用jsonPath而不是as

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

您的json路径可以指向您希望在体内具有json对象列表的任何位置。在此示例中(针对您的问题),它仅指向json根。

sidenode:请放心在内部使用jackson进行反序列化(.jsonPath.as


all*_*m93 7

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

expect().
 body("get(0).firstName", equalTo("Mike")).
when().
 get("person/");
Run Code Online (Sandbox Code Playgroud)

这是我的情况


小智 5

如果有人还在寻找.使用Java 1.8和RestAssured 2.9,解决方案非常简单,并且不会抛出"未经检查的警告".

return Arrays.asList(given()
            .when()
            .get("restPath")
            .then()
            .extract()
            .response()
            .body()
            .as(Player[].class));
Run Code Online (Sandbox Code Playgroud)


Ash*_*eze 5

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

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

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

  • 更短的语法对我来说也很有效:“.as(new TypeRef&lt;&gt;() {})”,感谢“import io.restassured.mapper.TypeRef;”,即使使用旧的 2019 年“io.rest-assured”,版本:'3.3.0'` (2认同)