Я пишу клиента RESTeasy Proxy для использования Apple's API для извлечения списка категорий iTunes. При запросе информации о данной категории, например, с этим URL:JAX-RS/Jackson - Deserialize JSON с неизвестным именем элемента корня?
https://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/genres?id=1420
... вы получите ответ в формате JSON, который выглядит следующим образом:
{
"1420":{
"name":"Self-Help",
"id":"1420",
"url":"https://itunes.apple.com/us/genre/podcasts-health-self-help/id1420?mt=2",
"rssUrls":{
"topVideoPodcastEpisodes":"https://itunes.apple.com/us/rss/topvideopodcastepisodes/genre=1420/json",
"topAudioPodcasts":"https://itunes.apple.com/us/rss/topaudiopodcasts/genre=1420/json",
"topVideoPodcasts":"https://itunes.apple.com/us/rss/topvideopodcasts/genre=1420/json",
"topPodcasts":"https://itunes.apple.com/us/rss/toppodcasts/genre=1420/json",
"topAudioPodcastEpisodes":"https://itunes.apple.com/us/rss/topaudiopodcastepisodes/genre=1420/json",
"topPodcastEpisodes":"https://itunes.apple.com/us/rss/toppodcastepisodes/genre=1420/json"
},
"chartUrls":{
"videoPodcastEpisodes":"https://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/charts?cc=us&g=1420&name=VideoPodcastEpisodes",
"podcasts":"https://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/charts?cc=us&g=1420&name=Podcasts",
"audioPodcastEpisodes":"https://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/charts?cc=us&g=1420&name=AudioPodcastEpisodes",
"audioPodcasts":"https://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/charts?cc=us&g=1420&name=AudioPodcasts",
"podcastEpisodes":"https://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/charts?cc=us&g=1420&name=PodcastEpisodes",
"videoPodcasts":"https://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/charts?cc=us&g=1420&name=VideoPodcasts"
}
}
}
Я пытаюсь отобразить эту JSON ответ на объект Java с использованием JAXB и Jackson. Тем не менее, «1420» имя корневого элемента, кажется, вызывает проблемы, так как я получаю следующее исключение при вызове моего клиента:
Unrecognized field "1420" (class foo.bar.ITunesCategoryList), not marked as ignorable
Мой класс JAXB выглядит следующим образом:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ITunesCategory implements TransferObject {
private static final long serialVersionUID = 3443545925023804457L;
@XmlElement(name = "id")
@JsonProperty("id")
private String identifier = null;
@XmlElement
private String name = null;
@XmlElementWrapper(name = "subgenres")
private List<ITunesCategory> subcategories = new ArrayList<ITunesCategory>();
...
}
Я даже попытался создать класс-оболочку, поскольку поиск может привести к возврату более чем одной категории. Это выглядит следующим образом:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ITunesCategoryList implements TransferObject {
private static final long serialVersionUID = 3303125979016445238L;
@XmlElement
private List<ITunesCategory> categories = new ArrayList<ITunesCategory>();
...
}
Однако, независимо от того, какого класса я определяю как мой тип возвращаемого значения, я получаю ту же ошибку, поскольку идентификатор категории является именем корневого элемента объекта JSON.
Есть ли способ сообщить JAXB/Jackson/JAX-RS/RESTeasy игнорировать имя корневого элемента и просто сопоставить базовый объект с Java? Невозможно узнать имя корневого элемента во время разработки/компиляции, так как оно напрямую соответствует результатам, возвращаемым поиском. Есть ли что-то, что можно сделать, чтобы обойти это исключение? Спасибо за любую помощь, которую вы можете дать!
Спасибо! Я обязательно посмотрю на это и сделаю это! – Shadowman
Работал как шарм! Благодаря! – Shadowman