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

2022-09-02 10:42:02

我有多态类型,从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


答案 1

这花了我很长时间来解决,所以我想我会分享。

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

visible=false确保如果类上存在该属性,则在反序列化期间不会用 的值填充该属性。typetype

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 { ... }

答案 2

一个简单的解决方案是将 和 配置移动到 一个 ,然后只注册反序列化。@JsonTypeInfo@JsonSubTypesMixInMixIn

mapper.getDeserializationConfig().addMixInAnnotations(MyClass.class, MyMixIn.class)