java - 使用 Resteasy 和 Jackson 注释从响应正文中解析 JSON 数组
问题描述
我正在使用带有 Quarkus 和 Jackson 注释的 Resteasy(io.quarkus.quarkus-resteasy
, io.quarkus.quarkus-resteasy-jackson
,版本 1.13.2.Final )。
我需要从我调用的 API 解析这种响应:
[
{
"name": "John Smith",
"age": 43
},
{
"name": "Jane Doe",
"age": 27
}
]
我无法更改此响应(例如,将此数组包装在具有属性的对象中)。响应正文的根元素是一个数组。
这是模型类:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Person {
private final String name;
private final int age;
@JsonCreator
public Person(@JsonProperty("name") String name,
@JsonProperty("age") int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
以下是我请求 API 的方式:
ResteasyClient resteasyClient = new ResteasyClientBuilderImpl().build();
try {
Response response = resteasyClient.target("/api/path")
.queryParam("param1", "value1")
.request()
.get();
List<Perso> person = response.readEntity( /* ? */ );
}
catch (ProcessingException e) {
// Handle the error...
}
我不能List<Person>.class
在readEntity
方法("Cannot select from parameterized type"
)中使用。
我尝试创建一个Persons
包含列表的包装器对象。但是 JSON 中的内容不是具有列表属性的对象,它是一个数组。所以它不起作用。
解决方案
该readEntity
方法有一个变体,而不是 a Class
,采用 a GenericType
。您可以使用readEntity(new GenericType<List<Person>>() {})
.
如果您有兴趣,该GenericType
课程使用了一个聪明的技巧,据我所知,Neal Gafter 在他的 Super Type Tokens 文章中首次描述了该技巧:http: //gafter.blogspot.com/2006/12/super -type-tokens.html
推荐阅读
- request - Unable to Request a WCSLayer - removeQueryParameters()
- google-cloud-platform - JDBC driver that can write to BigQuery
- django - what is the path one have to follow in order to become Full Stack developer?
- c++11 - 在函数内声明指针,C++
- jq - jq: error: xyz/0 is not defined at
, line 1: - laravel - “git pull”命令会删除 gitignore 中的文件夹和文件吗?
- php - Laravel 解决正确的返回类定义
- python - API 标题必须指定为“API_TITLE”应用程序参数或“标题”规范 kwarg
- python - 为了加快代码速度,Python 3.8/Pandas Dataframe
- pandas - Pandas:我如何计算不同值的数量?