2016-10-17 1 views
3

Я пытаюсь создать Java-пакет SDK для интерфейсной библиотеки, которая принимает вход JSON. По сути, этот SDK преобразует объекты определенного типа в JSON, который затем потребляется этой библиотекой переднего плана.Отсутствующее поле при десериализации с использованием Jackson (Polymorphic)

Я использую полиморфную сериализацию/десериализацию джексона с использованием его аннотационной системы.

У меня есть базовый класс A и 2 дочерних класса B и C, расширяющие A. Класс A имеет поле типа, с помощью которого я решаю, какой класс (B или C) должен использоваться. Синтаксис выглядит следующим образом: Так что теперь

@JsonTypeInfo({ 
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type" 
}) 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = B.class, name = "b"), 
    @JsonSubTypes.Type(value = C.class, name = "c") 
}) 
public class A { 
    private String type; 

    public void setType(String type){ 
    this.type = type; 
    } 

    public String getType(){ 
    return this.type; 
    } 
} 

public class B extends A { 

} 

public class C extends A { 

} 

, когда я использую readValue функцию Джексона ObjectMapper «s и читать строковой JSON и конвертировать в классе А, я получаю правильный экземпляр любого класса А или класса B на основе на значение переменной типа. Однако, и вот настоящая проблема, когда я пытаюсь использовать функцию getType Я всегда получаю null в этих объектах. Я не уверен, почему Джексон не устанавливает эти значения на объекте.

String json = "{ type: 'b' }"; // example input json 

ObjectMapper om = new ObjectMapper(); 
A a = om.readValue(json, A.class); 
// a is actually an instance of class B 

a.getType()// this is null 

ответ

2

Вам нужно добавить @JsonTypeInfo: параметр visible = true избежать, чтобы удалить тип при десериализации.

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type", 
    visible = true 
) 

общественное абстрактное логическое значение видимого() по умолчанию ложных

Свойства, которое определяет, будет ли значение идентификатора типа передаются как часть JSON потока в десериализатор (истинно), либо обрабатывается и удалены TypeDeserializer (ложный). Свойство не влияет на сериализацию . Значение по умолчанию - false, что означает, что Джексон обрабатывает и удаляет идентификатор типа из содержимого JSON, который передается в JsonDeserializer.

+0

спасибо, работает! не знаю, как я пропустил его в документации. – Rajan

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