如何使用Gson处理具有相同属性名称的不同数据类型?
我目前正在使用Gson用Java编写一个RSS提要解析器。我正在将RSS的XML转换为JSON,然后使用Gson将JSON反序列化为Java POJO(有点迂回,但这是有原因的)。就下面列出的源#1(BBC)的反序列化而言,一切正常,但是对于下面列出的源#2(NPR),我开始抛出异常。
我想我已经确定了问题,但我不确定如何解决它:
以下两个 RSS 源(例如)会出现此问题:
对于这些不同的 RSS 源,将返回一个名为“guid”的字段,作为 a) 具有 2 个字段的对象(如 BBC RSS 源中)或 b) 字符串(如 NPR RSS 源中)。
以下是相关 JSON 的一些释义版本:
英国广播公司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 Feed
// 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的文档后,我找不到现成的答案。