使用Google HTTP Client Library从JSON结果中解析匿名数组

时间:2014-10-12 16:51:54

标签: java json jackson robospice google-http-client

我的REST服务负责以下数据:

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

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

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())时,它就能正常工作。

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

3 个答案:

答案 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);
}