【问题标题】:Deserializing JSON array containing objects with an array using GSON使用 GSON 反序列化包含带有数组的对象的 JSON 数组
【发布时间】:2013-08-22 00:12:01
【问题描述】:

我有一个 JSON 响应,代表一个如下所示的乐队:

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

我正在尝试使用 GSON 将其反序列化为一个名为 SearchResults 的类,其中包含一个波段列表。我的 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 收到一条错误消息,提示 Expected BEGIN_OBJECT but is BEGIN_ARRAY。关于如何解决的任何想法?

【问题讨论】:

  • pictures 是您的类定义中的一个列表(即 JSON 数组),但它是您提供的示例 JSON 中的一个 JSON 对象。您是打算在 JSON 中使其成为一个数组,还是创建一个“图片”类或映射来表示各种图片大小?

标签: json gson


【解决方案1】:

你有几个问题。

首先,导致您发布错误的原因是您告诉 Gson 您的 JSON 代表一个对象 (SearchResults),而实际上它不是;您的 JSON 是一个对象数组(具体来说,是您映射到 Java Band 类的对象)。

正确的方法是通过:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多