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

Loc*_*yen 14 java json 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 { ... }
Run Code Online (Sandbox Code Playgroud)

当Jackson序列化为JSON时,它提供了我不想公开的类型信息.

{"type":"dog", ... }
{"type":"cat", ... }
Run Code Online (Sandbox Code Playgroud)

我能以某种方式阻止这种情况吗 我只想type在反序列化时忽略.

kar*_*der 7

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

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY,
visible = false, property = "type")
Run Code Online (Sandbox Code Playgroud)

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

include = JsonTypeInfo.As.EXISTING_PROPERTY规定如果该属性type存在,则在序列化期间使用该值,否则什么都不做。

所以把它们放在一起:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY,
visible = false, property = "type")
Run Code Online (Sandbox Code Playgroud)


Pro*_*uce 5

一个简单的解决方案是将the @JsonTypeInfo@JsonSubTypesconfigs 移动到a MixIn,然后只注册MixIn用于反序列化.

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

  • 您能否分享解决您问题的解决方案代码. (3认同)