2

我的 REST 服务响应以下数据:

[
    {
        "name": "Bart",
        "age": 10
    },
    {
        "name": "Homer",
        "age": 42
    },
    {
        "name": "Marjorie",
        "age": 34
    }
]

结果集是一个对象数组,我想用 Google 的 HTTP 客户端库自动解析这些对象。因此我创建了一个SimpsonResultSimpson类:

辛普森结果.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;
  }

}

辛普森.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()) 时,它就可以工作了。

所以我认为我的映射声明是错误的?

4

3 回答 3

3

你这样做的方式是无效的。SimpsonResult 需要一个名为 simpsons 的字段,而您的 json 中没有这样的字段。

由于在大多数框架中使用泛型集合类型有点棘手,我通常为此做的是在 Simpson 类中创建一个简单的列表类型:

public class Simpson {

  public static class List extends ArrayList<Simpson> {
  }

  ... //you simpson code
}

然后,您可以使用Simpson.List通过注释来解析您的 json。

于 2014-11-01T12:29:13.600 回答
1

您可以使用Type来解析参数化类,如下所示

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);
}
于 2017-03-17T07:00:50.100 回答
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);
}
于 2015-11-02T18:07:11.317 回答