Десериализация наследования с Джексоном в java - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть 3 дочерних класса с именем CreditAccount, Сберегательный счет и ChequingAccount, который расширяет один суперкласс с именем Account.

Я пытаюсь сохранить всех пользователей с соответствующими данными их учетной записи в HashMap следующим образом:

public HashMap<Long, HashMap<String, Account>> userAndHisAccountsObject;

, где HashMap имеет идентификатор пользователя в качестве ключа и объект HashMap в качестве значения, которое содержит AccountType в качестве ключа и соответствующую учетную запись, детализирующую его значение. Я успешно могу сериализовать этот объект, но когда я пытаюсь десериализовать его, он выдает com.fasterxml.jackson.databind.exc.InvalidTypeIdException

Могу ли я найти какое-либо решение для моей проблемы? Заранее спасибо.

1 Ответ

1 голос
/ 04 февраля 2020

Ответ действительно был предоставлен в комментариях @hollpolloi со ссылкой: https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

Когда вы используете наследование и Джексона, вам нужен способ рассказать Джексону, как различать различные JSON друг от друга, и как решить, какой тип объекта (класс) каждый из них. Проблема в том, что Джексона можно спутать с аналогичными JSON полезными нагрузками, когда нет атрибута, который сообщает Джексону, какой класс следует использовать .

Еще одна хорошая справка q / a: Десериализовать JSON с Джексоном в Polymorphi c Типы - Полный пример дает мне ошибку компиляции

Очень простое решение - аннотировать ваши классы чем-то вроде следующего:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public abstract class Animal {
   ...
}

См. Также:

...