Я использую Jackson's ObjectMapper
для десериализации представления JSON объекта, который содержит интерфейс как один из его свойств. Упрощенная версия кода можно увидеть здесь:Java: Джексон полиморфная JSON десериализация объекта с свойством интерфейса?
https://gist.github.com/sscovil/8735923
В принципе, у меня есть класс Asset
с двумя свойствами: type
и properties
. Модель JSON выглядит следующим образом:
{
"type": "document",
"properties": {
"source": "foo",
"proxy": "bar"
}
}
Свойство properties
определяется как интерфейс называется AssetProperties
, и у меня есть несколько классов, которые реализуют его (например DocumentAssetProperties
, ImageAssetProperties
). Идея состоит в том, что файлы изображений имеют разные свойства (высота, ширина), чем файлы документов, и т. Д.
Я работал с примерами в this article, прочитал документы и вопросы здесь, на SO и за его пределами, и экспериментировал с разными конфигурации в параметрах аннотации @JsonTypeInfo
, но они не смогли взломать эту гайку. Любая помощь будет принята с благодарностью.
Совсем недавно, исключение я получаю это:
java.lang.AssertionError: Could not deserialize JSON.
...
Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'source' into a subtype of [simple type, class AssetProperties]
Заранее спасибо!
РЕШЕНИЕ:
С большое спасибо @ Михал Ziober, я был в состоянии решить эту проблему. Я также мог использовать Enum в качестве идентификатора типа, который занимал часть Googling. Вот обновленный Gist с рабочим кодом:
https://gist.github.com/sscovil/8788339
Что делает вывод Json для чего-то подобного? Есть ли множество встроенных метаданных? – ingyhere
Спасибо за ссылку на сообщение programmerbruce. Какой замечательный ресурс – slugmandrew