使用 Resteasy 和 Jackson 注释从响应主体解析 JSON 数组
Parse JSON array from a response body using Resteasy and Jackson annotations
我正在使用带有 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
}
]
我无法更改此响应(例如,用 属性 将此数组包装在一个对象中)。响应体的根元素是一个数组。
这是模型class:
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...
}
我无法在 readEntity
方法 ("Cannot select from parameterized type"
) 中使用 List<Person>.class
。
我尝试创建一个包含列表的 Persons
包装器对象。但是 JSON 中的内容不是带有列表 属性 的对象,它是一个数组。所以没用。
readEntity
方法有一个变体,它采用 GenericType
而不是 Class
。您可以使用 readEntity(new GenericType<List<Person>>() {})
.
如果您有兴趣,GenericType
class 使用了一个巧妙的技巧,据我所知,Neal Gafter 在他的 Super Type Tokens 文章中首次描述了该技巧:http://gafter.blogspot.com/2006/12/super-type-tokens.html
我正在使用带有 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
}
]
我无法更改此响应(例如,用 属性 将此数组包装在一个对象中)。响应体的根元素是一个数组。
这是模型class:
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...
}
我无法在 readEntity
方法 ("Cannot select from parameterized type"
) 中使用 List<Person>.class
。
我尝试创建一个包含列表的 Persons
包装器对象。但是 JSON 中的内容不是带有列表 属性 的对象,它是一个数组。所以没用。
readEntity
方法有一个变体,它采用 GenericType
而不是 Class
。您可以使用 readEntity(new GenericType<List<Person>>() {})
.
如果您有兴趣,GenericType
class 使用了一个巧妙的技巧,据我所知,Neal Gafter 在他的 Super Type Tokens 文章中首次描述了该技巧:http://gafter.blogspot.com/2006/12/super-type-tokens.html