我正在使用Gson在Java中编写RSS订阅源解析器。我将RSS的XML转换为JSON,然后使用Gson将JSON反序列化为Java POJO(有些迂回,但有其原因)。就反序列化第一条订阅源(下面的BBC)而言,一切都正常运行,但对于下面列出的第二个订阅源(NPR),我开始收到异常。
我认为我已经确定了问题,但不确定如何解决:
这两个RSS订阅源(例如)存在问题:
对于这些不同的RSS订阅源,称为“guid”的字段被返回为a)具有2个字段的对象(如BBC RSS Feed)或b)字符串(如NPR RSS Feed)。
以下是相关JSON的某些改写版本:
BBC RSS Feed
// 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文档后,没有找到一个可用的答案。