Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JSon错误“;应为BEGIN“U对象,但在第1行第2列为BEGIN”数组;_Android_Json_Illegalstateexception - Fatal编程技术网

Android JSon错误“;应为BEGIN“U对象,但在第1行第2列为BEGIN”数组;

Android JSon错误“;应为BEGIN“U对象,但在第1行第2列为BEGIN”数组;,android,json,illegalstateexception,Android,Json,Illegalstateexception,我从一个web服务获取JSon数据,下面给出了示例数据: [ { "SectionId": 1, "SectionName": "Android" } ] 当我试图转换它时,它会抛出一个错误,我是这样做的: Data data = new Gson().fromJson(jsonDataFromWebService, Data.class); 我的班级是: class Section { public int SectionId; public Str

我从一个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;
}
class部分
{
公共ID;
公共字符串节名;
}
类数据{
公开名单部分;
}
日志显示:

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException: 应为BEGIN_对象,但在第1行第2列为BEGIN_数组


这个错误解释了什么是错的。。。u r返回数组而不是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;
JSONArray ja=新的JSONArray(jsonStringReturnedByService);
数据段=新数据();
对于(int i=0;i
您试图从JSONArray创建一个非数组(集合)对象。错误很明显:GSON期望的是对象的开头,但却找到了数组的开头

查看下面的文档页面,了解如何使用GSON处理数组和集合类型

从文档中:

数组示例

Gson Gson=新的Gson();int[]int={1,2,3,4,5};字符串[]字符串 ={“abc”、“def”、“ghi”}

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

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

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

Gson Gson=新的Gson();收集ints= 列表。不可变列表(1,2,3,4,5)

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

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

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

收藏限制

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


仅按以下方式使用截面类:

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

这是一个糟糕的答案。改变API返回数据的方式并不总是一个选项。虽然这段代码可以回答这个问题,但提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。