使用Google HTTP客户端库从JSON结果解析匿名数组



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

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

结果集是一个对象数组,我想用谷歌的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())中时,它就工作了。

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

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

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

public class Simpson {
  public static class List extends ArrayList<Simpson> {
  }
  ... //you simpson code
}

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

您可以使用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);
}

试试这个。。

@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);
}

相关内容

  • 没有找到相关文章

最新更新