如何防止Jackson序列化多态类型的注解属性?

enxuqcxy  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(186)

我有多态类型,从JSON到POJO的反序列化是有效的。事实上,我遵循了here文档。当将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

kmbjn2e3

kmbjn2e31#

这花了我很长时间才解决,所以我想我应该分享。

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

visible=false可确保如果类别上有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 { ... }
gblwokeq

gblwokeq2#

一个简单的解决方案是只将@JsonTypeInfo@JsonSubTypes配置移到MixIn,然后只注册MixIn以进行反序列化。
mapper.getDeserializationConfig().addMixInAnnotations(MyClass.class, MyMixIn.class)

相关问题