簡體   English   中英

使用Google HTTP Client Library從JSON結果解析匿名數組

[英]Parse anonymous array from JSON result with Google HTTP Client Library

我的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() )時,它可以工作。

所以我認為我的映射聲明是錯誤的?

您這樣做的方法無效。 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM