2017-01-16 2 views
1

Я хочу (un) маршалировать объект, содержащий поле this type. Хотя сериализация работает хорошо, я не могу ее десериализовать. Реализация классов не под моим контролем. Я предполагаю, что в целом невозможно десериализовать исходный класс реализации из-за отсутствия конструкторов и/или сеттеров.Jackson deserialize полиморфные типы не под моим контролем

С другой стороны, я хочу сохранить всю информацию (как объект java), содержащуюся в json.

Каковы мои возможности для достижения этой цели, существуют ли лучшие или эффективные методы?

ответ

1

Вы можете использовать Jackson Mixins для подделки аннотации @JsonDeserialize(using=CostumDeserializer.class) относительно рассматриваемого класса/поля. Затем вы можете попытаться создать экземпляры самостоятельно в данном классе десериализатора.

// I'm not sure whether annotations (@JsonTypeInfo) on class level are supported as well to allow the polymorphistic type decision. 
abstract class MixIn { 

    // make constructor usable if available 
    MixIn(@JsonProperty("id") int a, @JsonProperty("name") String b) { } 

    @JsonDeserialize(using=CostumDeserializer.class) abstract TypeX getTypeX(); 

} 

И тогда вы можете использовать его как это

objectMapper.addMixIn(TypeXContainer.class, MixIn.class); 

DOKS: http://wiki.fasterxml.com/JacksonMixInAnnotations

Смежные вопросы