我试图阅读以下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;
}
}
我只想知道&#34;项目中的内容&#34;对象所以我假设上面的类在调用时会起作用:
Gson gson = new Gson();
RSSWrapper wrapper = gson.fromJson(JSON_STRING, RSSWrapper.class);
但我得到一个错误:
线程中的异常&#34; main&#34; com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:预期BEGIN_ARRAY但是 BEGIN_OBJECT
我真的不知道这意味着什么,所以我不知道在哪里寻找错误,希望有更好的GSON知识的人可以帮助我?
谢谢:)
答案 0 :(得分:1)
您的JSON字符串和RSSWrapper
类不兼容:Channel
期望{J}字符串包含一个项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"
}],
表示它是一个包含一个元素的数组。
答案 1 :(得分:1)
如果您控制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"
}]
如果您不这样做,并希望您的程序能够处理具有相同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
包装成数组即可替换它。如果JSON_STRING
已经是item
,则会JSONArray
保持不变。