的Android JSON错误“预期BEGIN_OBJECT但BEGIN_ARRAY位于第1行第2列

2019-05-12 06:35发布

我从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但BEGIN_ARRAY位于第1行第2列

Answer 1:

错误解释了什么是错...乌尔返回一个数组,而不是一个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;


Answer 2:

你想创建一个从JSONArray的(集合)非数组对象。 该错误是相当清楚的:GSON在等一个对象的开始,但发现一个数组的开头来代替。

看看文档页面下面来看看如何使用数组和集合与GSON工作

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

从文档:

阵列的例子

GSON GSON =新GSON(); INT []整数= {1,2,3,4,5}; 串[]字符串= { “ABC”, “DEF”, “GHI”};

(串行化)gson.toJson(整数); ==>打印[1,2,3,4,5] gson.toJson(字符串); ==>打印[ “ABC”, “DEF”, “GHI”]

(反序列化)INT [] INTS2 = gson.fromJson( “[1,2,3,4,5]”,INT []类。); ==> INTS2将相同整数

我们还支持多维数组,具有任意复杂的元件类型类别实例

GSON GSON =新GSON(); 收集整型= Lists.immutableList(1,2,3,4,5);

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

(反序列化)类型collectionType =新TypeToken>(){}的getType(); 收集INTS2 = gson.fromJson(JSON,collectionType); INTS2是相同整数

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

集合限制

可序列化的任意对象的集合,但不能从它反序列化因为有没有办法用户指示生成的对象的类型,而反序列化,集合必须是特定的泛型类型所有的这是有道理的,而且是很少的一个问题W>母鸡下优秀的Java编码实践



Answer 3:

使用科类只如下:

Section[] sectionArray = new Gson().fromJson(jsonDataFromWebService, Section[].class);
for (Section section: sectionArray) {
     Log.e("Debug", section.toString());
}


文章来源: Android JSon error “Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2”