@JsonTypeInfo(use = JsonTypeInfo.Id.Class)

方案二:修改基类,@JsonTypeInfo & @JsonSubtypes

方案三:不修改实际的类,MixIn

要在不修改实际类的情况下注册 @JsonTypeInfo,您必须使用这样的混合器:

// actual base type that we don't want to or can't modfiy 
// because it is in a different module / 3rd party
public class BaseType {  
    ...
}

// mixin for BaseType to define @JsonTypeInfo
// this can be in a completely different package / module
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY, property = "type")
public abstract class BaseTypeMixIn {
}

必须手动为ObjectMapper注册混合器:

objectMapper.addMixIn(BaseType.class, BaseTypeMixIn.class);

BaseType现在有效地拥有了来自mixin的@JsonTypeInfo。Mixin jackson是解决“如何注释无法修改的类”问题的通用解决方案。

对于子类型,类型信息可以通过ObjectMapper.registerSubtypes注册,也可以通过用@JsonSubtypes注释混合输入来注册。在这种情况下,我更喜欢在没有注释的情况下执行,因为如果不同的模块有不同的基类型的子类型,它也能工作。注册多个混合器很可能不起作用。

public class SubTypeA extends BaseType {
   ...
}

public class SubTypeB extends BaseType {
    ...
}

在ObjectMapper中注册:

objectMapper.registerSubtypes(
   new NamedType(SubTypeA.class, "A"), 
   new NamedType(SubTypeB.class, "B"));