Android JSon错误"预计BEGIN_OBJECT但在第1行第2列是BEGIN_ARRAY"

Yaq*_*mad 6 android json illegalstateexception

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

[
  {
    "SectionId": 1,
    "SectionName": "Android"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

Data data = new Gson().fromJson(jsonDataFromWebService, Data.class);
Run Code Online (Sandbox Code Playgroud)

我的科级是:

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

class Data {
    public List<Section> sections;
}
Run Code Online (Sandbox Code Playgroud)

LogCat说:

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

Dal*_*osa 8

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

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

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

来自文档:

数组示例

Gson gson = new Gson(); int [] ints = {1,2,3,4,5}; String [] strings = {"abc","def","ghi"};

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

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

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

Gson gson = new Gson(); Collection ints = Lists.immutableList(1,2,3,4,5);

(序列化)字符串json = gson.toJson(整数); ==> json是[1,2,3,4,5]

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

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

收藏限制

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


Aam*_*mir 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;
Run Code Online (Sandbox Code Playgroud)

  • 这是一个糟糕的答案.更改API返回数据的方式并不总是一种选择. (2认同)