如何阻止Jackson序列化多态类型的注释属性?
我有多态类型和反序列化从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 { ... }
当Jackson序列化为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
,则在反序列化期间不会使用type
的值填充它。
include = JsonTypeInfo.As.EXISTING_PROPERTY
指示如果属性type
存在,则在序列化期间使用该值,否则不执行任何操作。
所以把它们放在一起:
import static org.codehaus.jackson.annotate.JsonTypeInfo.*; @JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY, visible = false, 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 { ... }
- 由于java.lang.NoClassDefFoundError无法运行代码:com / fasterxml / jackson / annotation / JsonMerge
- 无法捕获JsonMappingException
- Camel + Jackson:为所有反序列化注册一个模块
- Jackson ObjectMapper无法反序列化POJO,抛出exception:没有为类型找到合适的构造函数:无法从JSON对象实例化
- 如何为jackson编写一个全能(de)序列化器
- Jackson在Spring Boot中错误地序列化了ZonedDateTime
- jackson反序列化error handling
- jackson:从json中删除一些值并保留一些空值
- JAX-RS:如何将我的对象列表作为JSON返回?