[英]Gson throws IllegalStateException when attempting to parse List
[英]IllegalStateException when using GSON
我试图读取以下JSON文件:
{ "rss" : {
"@attributes" : {"version" : "2.0" },
"channel" : {
"description" : "Channel Description",
"image" : {
"link" : "imglink",
"title" : "imgtitle",
"url" : "imgurl"
},
"item" : {
"dc_format" : "text",
"dc_identifier" : "link",
"dc_language" : "en-gb",
"description" : "Description Here",
"guid" : "link2",
"link" : "link3",
"pubDate" : "today",
"title" : "Title Here"
},
"link" : "channel link",
"title" : "channel title"
}
}
}
进入这个对象:
public class RSSWrapper{
public RSS rss;
public class RSS{
public Channel channel;
}
public class Channel{
public List<Item> item;
}
public class Item{
String description;//Main Content
String dc_identifier;//Link
String pubDate;
String title;
}
}
我只对知道“ item”对象中的内容感兴趣,因此我认为上述类在调用时会起作用:
Gson gson = new Gson();
RSSWrapper wrapper = gson.fromJson(JSON_STRING, RSSWrapper.class);
但我收到一个错误:
线程“ main”中的异常com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY,但为BEGIN_OBJECT
我真的不知道这意味着什么,所以我不知道在哪里寻找错误,希望对GSON有更好了解的人可以帮助我?
谢谢 :)
您的JSON字符串和RSSWrapper
类不兼容:当JSON字符串包含一项时, Channel
希望具有List<Item>
。 您必须将Channel
修改为:
public class Channel{
public Item item;
}
或JSON为:
"item" : [{
"dc_format" : "text",
"dc_identifier" : "link",
"dc_language" : "en-gb",
"description" : "Description Here",
"guid" : "link2",
"link" : "link3",
"pubDate" : "today",
"title" : "Title Here"
}],
表示它是一个有一个元素的数组。
如果您控制JSON输入的外观,最好将item
更改为JSON数组
"item" : [{
"dc_format" : "text",
"dc_identifier" : "link",
"dc_language" : "en-gb",
"description" : "Description Here",
"guid" : "link2",
"link" : "link3",
"pubDate" : "today",
"title" : "Title Here"
}]
如果您不这样做,并且希望程序能够使用相同的RSSWrapper
类处理item
数组或对象,那么请执行以下RSSWrapper
: 这是适合您的程序化解决方案。
JSONObject jsonRoot = new JSONObject(JSON_STRING);
JSONObject channel = jsonRoot.getJSONObject("rss").getJSONObject("channel");
System.out.println(channel);
if (channel.optJSONArray("item") == null) {
channel.put("item", new JSONArray().put(channel.getJSONObject("item")));
System.out.println(channel);
}
Gson gson = new Gson();
RSSWrapper wrapper = gson.fromJson(jsonRoot.toString(), RSSWrapper.class);
System.out.println(wrapper.rss.channel.item.get(0).title); // Title Here
使用Java org.json解析器,代码只需将JSONObject
包装到数组中即可替换它。 如果item
已经是JSONArray
, JSON_STRING
保持JSON_STRING
不变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.