Я использую Jackson ObjectMapper
для десериализации представления JSON объекта, который содержит интерфейс в качестве одного из его свойств. Здесь можно увидеть упрощенную версию кода:
https://gist.github.com/sscovil/8735923
В принципе, у меня есть класс Asset
с двумя свойствами: type
и properties
. Модель JSON выглядит так:
{
"type": "document",
"properties": {
"source": "foo",
"proxy": "bar"
}
}
Свойство properties
определяется как интерфейс под названием AssetProperties
, и у меня есть несколько классов, которые его реализуют (например, DocumentAssetProperties
, ImageAssetProperties
). Идея состоит в том, что файлы изображений имеют разные свойства (высота, ширина), чем файлы документов, и т.д.
Я отработал примеры из этой статьи, прочитал документы и вопросы здесь, на 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]
Спасибо заранее!
РЕШЕНИЕ:
Благодаря большому спасибо @Michał Ziober, я смог решить эту проблему. Я также мог использовать Enum в качестве идентификатора типа, который занимал часть Googling. Вот обновленный Gist с рабочим кодом: