@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"));