2014-02-06 3 views
3

Я пишу API поверх Spring Web MVC/Spring Hateoas, и даже если десериализация простой иерархии классов работает как шарм, мне не удастся десериализовать вход Json для правильного типа с помощью jackson. Вот мой класс иерархии:Наследование и десериализация Джексона

public class A { 
    protected String fieldA; 
} 

public class B extends A { 
    protected String fieldB; 
} 

public class C extends A { 
    protected String fieldC; 
} 

Перед каждый посылает меня на многие другие подобные вопросы на SO, главное отличие в том, что А бетон. Другими словами, Джексон должен выбирать между 3 реализациями, используя json-поля в качестве таймерных выключателей.

В принципе, как я могу настроить Джексон, чтобы он Deserialize:

{ 
    "fieldA": "asdf" 
} 

к экземпляру А и

{ 
    "fieldA": "asdf", 
    "fieldB": "asdf" 
} 

к экземпляру B?

ответ

3

Невозможно сделать это автоматически: вся автоматическая обработка полиморфного типа зависит от типа дискриминатора какого-либо типа (тип свойства, чаще всего). Была запрошена возможность использования эвристики на основе контента, но пока никто не представил жизнеспособный план (или вклады) для реализации таких функций.

Чтобы справиться с этим, вам, вероятно, потребуется написать обычай JsonDeserializer и определить тип самостоятельно. Возможно, можно будет использовать ConvertingDeserializer, чтобы Джексон связал JSON в JsonNode или java.util.Map, а затем просто извлеките его самостоятельно.

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