我试图从JSON中将一些MediaWiki上下文反序列化为使用Jackson进入POJO。但是,问题在于其中一个JSON对象名称是文章的整数ID值,因此不能使用像@JsonProperty
这样的注释,因为该值永远不会保持不变。使用Jackson解析动态生成的JSON对象名称
下面是一些示例JSON来形容我的意思是:
http://en.wikipedia.org/w/api.php?action=query&titles=Albert%20Einstein&prop=info&format=json&indexpageids
{
"query": {
"pageids": [
"736"
],
"pages": {
"736": {
"pageid": 736,
"ns": 0,
"title": "Albert Einstein",
"contentmodel": "wikitext",
"pagelanguage": "en",
"touched": "2014-01-05T03:14:23Z",
"lastrevid": 588780054,
"counter": "",
"length": 106159
}
}
}
}
(链接到MediaWiki建议添加& indexpageids参数,以协助解析,但我看不出它如何将有用)
我试着使用@JsonAnyGetter
和@JsonAnySetter
注释,但它们似乎没有帮助,抛出同样的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "736" (class WikipediaPages), not marked as ignorable (one known property: "wikipediaPage"])
。
感谢您的任何和所有帮助。
编辑:下面是相关类看起来像此刻什么:
public class WikipediaPages {
private Map<String, WikipediaPage> wikipediaPageMap = new HashMap<String, WikipediaPage>();
public Map<String, WikipediaPage> getWikipediaPageMap() {
return wikipediaPageMap;
}
public void setWikipediaPageMap(Map<String, WikipediaPage> wikipediaPageMap) {
this.wikipediaPageMap = wikipediaPageMap;
}
}
我使用的是杰克逊的Mixin应用注释:
public interface WikipediaPagesMixIn {
@JsonAnyGetter
Map<String, WikipediaPage> getWikipediaPageMap();
@JsonAnySetter
void setWikipediaPageMap(Map<String, WikipediaPage> wikipediaPageMap);
}
编辑2:更多的代码,如要求:
public class JacksonBuilder {
private static ObjectMapper objectMapper;
public static ObjectMapper getObjectMapper() {
if(objectMapper == null) {
objectMapper = new ObjectMapper();
objectMapper.registerModule(new WikipediaModule());
}
return objectMapper;
}
}
public class WikipediaModule extends SimpleModule {
public WikipediaModule() {
super("WikipediaModule", new Version(1, 0, 0, null, "net.ryanmorrison", "sentience"));
}
@Override
public void setupModule(SetupContext setupContext) {
setupContext.setMixInAnnotations(WikipediaPage.class, WikipediaPageMixIn.class);
setupContext.setMixInAnnotations(WikipediaPages.class, WikipediaPagesMixIn.class);
setupContext.setMixInAnnotations(WikipediaQuery.class, WikipediaQueryMixIn.class);
setupContext.setMixInAnnotations(WikipediaResult.class, WikipediaResultMixIn.class);
}
}
public class WikipediaResult {
private WikipediaQuery wikipediaQuery;
public WikipediaQuery getWikipediaQuery() {
return wikipediaQuery;
}
public void setWikipediaQuery(WikipediaQuery wikipediaQuery) {
this.wikipediaQuery = wikipediaQuery;
}
}
public interface WikipediaResultMixIn {
@JsonProperty("query")
WikipediaQuery getWikipediaQuery();
}
使'页面'为'Map'其中'页面包含所有其他数据。 –
同样的例外:'com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“38991692”(class WikipediaPages),未标记为可忽略(一个已知属性:“wikipediaPageMap”])''。 –
向我们显示您的代码。 –