2014-02-16 2 views
3

У меня есть следующие структуры объекта:Как использовать Джексон с Дженерики

public class Animal<T> implements IMakeSound<T> 
public class Dog<T> extends Animal<T> 
public class Cat<T> extends Animal<T> 

Я хочу сериализации и де-сериализации моего объекта с помощью Джексоном.
Проблема в том, что в Json я получаю LinkedHashmap в T, а de-sirializtion - к базовому объекту Animal.

Когда я добавляю ограничение на Т т.е. чем она прекрасно работает из-за аннотации Джексона

@JsonSubTypes({ 
    @Type(value = PuffyTail.class, name = "puffyTail"), 
    @Type(value = StraightTail.class, name = "straightTail") }) 
class Tail { 
... 

Но это не поведение, что я хотел - я не использую < X расширяет Y>.

Есть ли способ работать с java-генериками и получить нужный объект, который был сериализован?
Есть ли способ сделать это без аннотаций?

+1

Поскольку дженерики компиляции типа время стерло вам необходимо предоставить намеки Джексона о том, как создать родовые типы. –

ответ

2

Вы можете указать TypeReference при чтении значения из вашего ObjectMapper для того, чтобы разобрать правильно типизированный объект:

Cat<PuffyTail> fluffyKitty = objectMapper.readValue(jsonString, 
     new TypeReference<Cat<PuffyTail>>(){}); 
Смежные вопросы