Jackson десериализация полиморфных типов

При сериализации и десериализации обычных классов в JSON и обратно проблем, как правило, не возникает. Но что делать, если классы образуют из себя иерархию? Если нам нужно десериализовать экземпляр интерфейса? Абстрактного класса? Куда сохранять информацию о типе Java?

Давайте посмотрим на следующие классы:

Если нам нужно сериализовать любой из экземпляров класса Monster  в JSON, а потом десериализовать его же, то нам нужно сохранять информацию о типе сериализованного класса в JSON. Для этого используется аннотация com.fasterxml.jackson.annotation.JsonTypeInfo. Эту аннотацию нужно добавить к базовому классу иерархии, в данном случае к классу Monster:

Обратите внимание на атрибут property, который указывает имя свойства в JSON, в которое будет записано имя типа Java.

Теперь попробуем сериализовать экземпляр класса Skeleton (оформим всё в виде тестов Maven):

Файл “skeleton.json” имеет такое содержимое:

Тест десериализации из этого JSON с помощью Jackson:

Как видите, в этом тесте Jackson берёт имя типа Java из файла и создаёт экземпляр Skeleton.

Теперь попробуем сериализовать в JSON экземпляр класса Vampire:

Файл “vampire.json”:

Десериализация класса Vampire  из этого JSON-файла:

Аннотацию @JsonTypeInfo  можно указывать и у полей, для которых нужно сохранить информацию о типе при сериализации в JSON.

Ссылки:

Исходные код на GitHub

ZIP-архив с исходными кодами

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *