我的REST服务负责以下数据:
[
{
"name": "Bart",
"age": 10
},
{
"name": "Homer",
"age": 42
},
{
"name": "Marjorie",
"age": 34
}
]
结果集是一个对象数组,我想用Google的HTTP客户端库自动解析这些对象。因此,我创建了SimpsonResult
和Simpson
类:
SimpsonResult.java
public class SimpsonResult {
private List<Simpson> simpsons;
public SimpsonResult() {
}
public List<Simpson> getSimpsons() {
return simpsons;
}
public void setSimpsons(List<Simpson> simpsons) {
this.simpsons = simpsons;
}
}
Simpson.java
public class Simpson {
@Key
private String name;
@Key
private int age;
public Simpson() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
现在我想查询我的后端并自动将响应映射到SimpsonResult
。因此我写了以下代码:
@Override
public SimpsonResult loadDataFromNetwork() throws IOException {
HttpRequestFactory requestFactory = getHttpRequestFactory();
GenericUrl url = new GenericUrl(baseUrl);
HttpRequest request = requestFactory.buildGetRequest(url);
request.setParser(new JacksonFactory().createJsonObjectParser());
return request.execute().parseAs(SimpsonResult.class);
}
但是当我执行代码时,我从com.google.api.client.json.JsonParser
获得了一个解析器异常。
当我将其映射到字符串(request.execute().parseAsString()
)时,它就能正常工作。
所以我认为我的映射声明是错误的?
答案 0 :(得分:3)
你这样做是无效的。 SimpsonResult需要一个名为simpsons的字段,而你的json中没有这样的字段。
在大多数框架中使用泛型集合类型有点棘手,我通常要做的就是在Simpson类中创建一个简单的列表类型:
public class Simpson {
public static class List extends ArrayList<Simpson> {
}
... //you simpson code
}
然后,您可以使用Simpson.List
通过注释解析您的json。
答案 1 :(得分:1)
您可以使用键入来解析参数化类,如下所示
Type type = new TypeToken<ArrayList<SimpsonResult>>() {}.getType();
request.execute().parseAs(type);
不建议创建一个额外的类,扩展像ArrayList这样的参数化类,仅用于解析。因此,您的功能可以写成
@Override
public ArrayList<SimpsonResult> loadDataFromNetwork() throws IOException {
HttpRequestFactory requestFactory = getHttpRequestFactory();
GenericUrl url = new GenericUrl(baseUrl);
HttpRequest request = requestFactory.buildGetRequest(url);
Type type = new TypeToken<ArrayList<SimpsonResult>>() {}.getType();
return request.execute().parseAs(type);
}
答案 2 :(得分:0)
试试这个..
@Override
public Simpson[] loadDataFromNetwork() throws IOException {
HttpRequestFactory requestFactory = getHttpRequestFactory();
GenericUrl url = new GenericUrl(baseUrl);
HttpRequest request = requestFactory.buildGetRequest(url);
request.setParser(new JacksonFactory().createJsonObjectParser());
return request.execute().parseAs(Simpson[].class);
}