Android JSon错误“;应为BEGIN“U对象,但在第1行第2列为BEGIN”数组;
我从一个web服务获取JSon数据,下面给出了示例数据: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
[
{
"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返回数据的方式并不总是一个选项。虽然这段代码可以回答这个问题,但提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。