使用GSON反序列化包含具有数组的对象的JSON数组

时间:2013-08-22 00:12:02

标签: json gson

我有一个JSON响应代表一个看起来像这样的乐队:

[
 {
  "Picture": {
  "Small": "someurl
  "Medium": "someurl",
  "Large": "someurl",
  "XLarge": "someurl"
},
"Name": "Tokyo Control Tower",
"Guid": "TCT",
"ID": 15
 }
]

我正在尝试使用GSON将其反序列化为一个名为SearchResults的类,其中包含一个Band列表。我的SearchResults和Band类看起来像这样:

public class SearchResults {
    public List<Band> results;
}

public class Band {
    @SerializedName("Name")
    public String name;

    @SerializedName("Guid")
    public String guid;

    @SerializedName("ID")
    public Integer id;

    @SerializedName("Picture")
    List<Photo> pictures;

}

在我的代码中,我尝试将json字符串转换为:

protected void onPostExecute(String result) {
        Gson gson = new Gson();
        SearchResults results = gson.fromJson(result, SearchResults.class);
        Band band = results.results.get(0);
        bandName.setText(band.name);
    }

当我运行此代码时,我收到来自GSON的错误说预期BEGIN_OBJECT但是BEGIN_ARRAY。关于如何解决的任何想法?

1 个答案:

答案 0 :(得分:3)

你有几个问题。

首先,导致你发布的错误的原因是你告诉Gson你的JSON代表了一个对象(SearchResults),当它没有;您的JSON是一个对象数组(具体来说,是您要映射到Java Band类的对象)。

正确的方法是:

Type collectionType = new TypeToken<Collection<Band>>(){}.getType();
Collection<Band> bands = gson.fromJson(jsonString, collectionType);

一旦你这样做,你就会遇到一个问题,你在Java类中说你的JSON中的“图片”是一个Photo个对象的数组,而事实上并非如此;这是一个单一的对象。