6

我从 Web 服务获取 JSON 数据,示例数据如下:

[
  {
    "SectionId": 1,
    "SectionName": "Android"
  }
]

当我尝试转换它时,它会抛出一个错误,我这样做是:

Data data = new Gson().fromJson(jsonDataFromWebService, Data.class);

我的科类是:

class Section
{
    public int SectionId;
    public String SectionName;
}

class Data {
    public List<Section> sections;
}

LogCat 说:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 预期 BEGIN_OBJECT 但在第 1 行第 2 列是 BEGIN_ARRAY

4

3 回答 3

8

您正在尝试从 JSONArray 创建一个非 Array(Collection) 对象。错误很明显:GSON 期待一个对象的开头,但却找到了一个数组的开头。

查看下面的文档页面,了解如何使用 GSON 使用 Array 和 Collection 类型

https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples

从文档:

数组示例

Gson gson = 新 Gson(); 整数 [] 整数 = {1, 2, 3, 4, 5}; 字符串[] 字符串 = {"abc", "def", "ghi"};

(序列化) gson.toJson(ints); ==> 打印 [1,2,3,4,5] gson.toJson(strings); ==> 打印 ["abc", "def", "ghi"]

(反序列化) int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); ==> ints2 将与 ints 相同

我们还支持多维数组,具有任意复杂的元素类型集合示例

Gson gson = 新 Gson(); 集合 ints = Lists.immutableList(1,2,3,4,5);

(序列化) String json = gson.toJson(ints); ==> json 是 [1,2,3,4,5]

(反序列化) Type collectionType = new TypeToken>(){}.getType(); 集合 ints2 = gson.fromJson(json, collectionType); ints2 与 ints 相同

相当可怕:注意我们如何定义集合的类型不幸的是,在 Java 中无法解决这个问题

收藏限制

可以序列化任意对象的集合但不能从中反序列化 因为用户无法指示结果对象的类型 在反序列化时,Collection 必须是特定的泛型类型 所有这些都是有道理的,而且很少有问题w> 遵循良好的 Java 编码实践

于 2012-02-25T07:33:54.780 回答
6

错误解释了什么是错的......你返回一个数组而不是一个 JSON 对象

尝试如下:

JSONArray ja = new JSONArray(jsonStringReturnedByService);

Data sections = new Data();

for (int i = 0; i < ja.length(); i++) {
    Section s = new Section();
    JSONObject jsonSection = ja.getJSONObject(i);

    s.SectionId = Integer.ValueOf(jsonSection.getString("SectionId"));
    s.SectionName = jsonSection.getString("SectionName");

   //add it to sections list
   sections.add(s);
}

return sections;
于 2012-02-25T07:24:59.130 回答
0

仅按如下方式使用 Section 类:

Section[] sectionArray = new Gson().fromJson(jsonDataFromWebService, Section[].class);
for (Section section: sectionArray) {
     Log.e("Debug", section.toString());
}
于 2013-09-18T15:41:59.773 回答