【发布时间】:2015-10-23 21:10:55
【问题描述】:
我目前正在使用 Gson 在 Java 中编写一个 RSS 提要解析器。我将 RSS 的 XML 转换为 JSON,然后使用 Gson 将 JSON 反序列化为 Java POJO(有点迂回,但这是有原因的)。就下面列出的 feed #1 (BBC) 的反序列化而言,一切工作正常,但对于下面列出的 feed #2 (NPR),我开始收到异常扔了。
我想我已经发现了问题,但我不确定如何解决它:
问题在于这两个 RSS 源(例如):
对于这些不同的 RSS 提要,一个名为“guid”的字段将作为 a) 一个对象 与 2 个字段(如 BBC RSS 提要)或b) 一个字符串(如 NPR RSS 提要)。
以下是相关 JSON 的一些释义版本:
BBC RSS 提要
// is returning 'guid' as an object
"item" :
[
{
// omitted other fields for brevity
"guid" : {
"isPermalink" : false,
"content" : "http:\/\/www.bbc.co.uk\/news\/uk-england-33745057"
},
},
{
// ...
}
]
NPR RSS 提要
// is returning 'guid' as a string
"item" :
[
{
// omitted other fields for brevity
"guid" : "http:\/\/www.npr.org\/sections\/thetwo-way\/2015\/07\/31\/428188125\/chimps-in-habeas-corpus-case-will-no-longer-be-used-for-research?utm_medium=RSS&utm_campaign=news"
},
{
// ...
}
]
我在 Java 中这样建模:
// RSSFeedItem.java
private Guid guid;
// GUID.java
private boolean isPermalink;
private String content;
所以在这种情况下,调用效果非常好
Gson gson = new Gson();
RssFeed rssFeed = gson.fromJson(jsonData, RssFeed.class);
对于 BBC RSS 供稿,但在解析 NPR RSS 供稿时会引发异常。
导致我得出这是类型错误结论的具体错误如下(在尝试反序列化 NPR RSS 提要时):
Severe: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was STRING at line 1 column 673 path
$.rss.channel.item[0].guid
无论如何,直截了当:我如何使用 Gson 处理这种情况,其中一个字段作为可能不同的数据类型返回?我猜可能有某种技巧或我可以使用注释来达到这种效果,但我不确定,在检查了 Gson 的文档后,我找不到现成的答案。
【问题讨论】:
标签: java json gson deserialization json-deserialization