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)
要从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)
如果您对使用"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)
我们现在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- 是可以在特定情况下进行的安全转换。