【问题标题】:How can I deserialize an array inside a JSON object?如何反序列化 JSON 对象中的数组?
【发布时间】:2010-10-17 00:50:14
【问题描述】:

我不知道如何使用 Gson 反序列化 JSON 对象内的数组。我试图反序列化的 json 对象如下所示:

{"item0":3,
 "item1":1,
 "item2":3,
 "array":[
    {"arrayItem1":321779321,
     "arrayItem2":"asdfafd",
     "arrayItem3":"asasdfadf"}]}

我设法构建了一个如下所示的类:

public class Watchlist {
 private int itemn0;
 private int itemn1;
 private int itemn2;
 private Object array;

}

但是当 gson 尝试反序列化数组时会抛出异常:

com.google.gson.JsonParseException: Type information is unavailable, and the target object is not a primitive: <my gson array>

谁能告诉我如何反序列化这个?

【问题讨论】:

  • 你能告诉我们你抛出这个异常的代码吗?
  • 抛出异常的代码只是一个fromJson调用Watchlist watchlist = gson.fromJson(jsonResponse, Watchlist.class);

标签: java json gson


【解决方案1】:

你的“数组”是一个数组。 所以在 watchList 类中

    public class Watchlist {
    private int itemn0;
    private int itemn1;
    private int itemn2;
    private List<watchListarray> array;

 //constructor
  //getter & setter of all

}

now watchListarray class
 public class watchListarray{
  String arrayItem1="";
  String arrayItem2="";
  String arrayItem3="";
//constructor 
 //getter & setters of all
}

现在使用下载 Gson 参考:http://primalpop.wordpress.com/2010/06/05/parsing-json-using-gson-in-android/

【讨论】:

    【解决方案2】:

    这里有几个问题:

    第一,我认为您使用数组的方式不像您想的那样。您有“arrayItem1”到 3,但它们包含在数组中的单个 JSON 对象中......所以数组实际上只有一个项目。

    数组应该是这样的:

    "array": [
      321779321,
      "asdfafd",
      "asasdfadf"
    ]
    

    第二个是你的Java类中array的类型是Object...这并没有给Gson任何类型信息用于翻译对象。通常,您希望将数组映射到的对象的类型声明为 List&lt;String&gt;List&lt;Integer&gt; 或类似的。这为它提供了必要的类型信息...... JSON 数组可以映射到 ListString 类型参数告诉它要将数组内容转换为什么类型。

    您的示例中数组的问题在于它不是同质的......它有一个数字和两个字符串。通常,应避免在数组/集合中混合此类类型。但是,您可以将 array 对象的类型声明为 List&lt;String&gt;...您只会得到 String 形式的数字。

    【讨论】:

    • 啊,是的。感谢您指出了这一点。你说的对。该数组只有 1 项。一个更好的例子是: {"item0":3, "item1":1, "item2":3, "array":[ {"arrayItem1":321779321, "arrayItem2":"asdfafd", "arrayItem3": "asasdfadf"}, {"arrayItem1":234, "arrayItem2":"asdfafd", "arrayItem3":"asdfa"}]}
    • ColinD,感谢您的解释。根据您所说的,我设法通过将我的数组转换为 List> 来使上述代码正常工作。但我想知道是否可以将其转换为 List?根据您的解释,这根本不可能吗?谢谢。
    • 是的,如果您定义了一个类,该类的字段对应于数组 (MyObject) 中 JSON 对象的字段,并将数组字段声明为 List&lt;MyObject&gt;,则可以正常工作!
    • 谢谢。我要再试一次。我正在调用的 API 只是给我扔了另一个 JSON 曲线球。数组中对象的值之一是另一个数组!我想我可能选择了更糟糕的 API 来学习 JSON。叹息。
    • 是否有关于您正在调用的 API 的文档可以准确地告诉您对每个对象的期望?您只需要创建一个与您可能收到的每个 JSON 对象的格式相匹配的 Java 类型,然后按照 API 的预期嵌套它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2019-01-14
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多