Ответ 1
Простое решение - просто переместить конфигурации @JsonTypeInfo
и @JsonSubTypes
в MixIn
, а затем зарегистрировать MixIn
для десериализации.
mapper.getDeserializationConfig().addMixInAnnotations(MyClass.class, MyMixIn.class)
У меня есть полиморфные типы и десериализация из JSON в POJO. Я фактически выполнил документацию здесь. При сериализации POJO в JSON я получаю нежелательный атрибут, в частности имя логического типа.
import static org.codehaus.jackson.annotate.JsonTypeInfo.*;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="type")
@JsonSubTypes({
@JsonSubTypes.Type(value=Dog.class, name="dog"),
@JsonSubTypes.Type(value=Cat.class, name="cat")
})
public class Animal { ... }
public class Dog extends Animal { ... }
public class Cat extends Animal { ... }
Когда Джексон сериализуется в JSON, он предоставляет информацию о типе, которую я не хочу раскрывать.
{"type":"dog", ... }
{"type":"cat", ... }
Можно ли это как-то предотвратить? Я хочу игнорировать type
при десериализации.
Простое решение - просто переместить конфигурации @JsonTypeInfo
и @JsonSubTypes
в MixIn
, а затем зарегистрировать MixIn
для десериализации.
mapper.getDeserializationConfig().addMixInAnnotations(MyClass.class, MyMixIn.class)
Мне потребовалось много времени, поэтому я решил поделиться с вами.
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY,
visible = false, property = "type")
visible=false
гарантирует, что если свойство type
существует в классе, оно не будет заполнено значением type
во время десериализации.
include = JsonTypeInfo.As.EXISTING_PROPERTY
диктует, что если свойство type
существует, используйте это значение во время сериализации, иначе ничего не делайте.