我找到了解决方案。 至少在这种情况下它很容易。 要解决此类任务,您需要使用jackson TypeIdResolver 。 这是一个例子:
1.首先,您需要注释基类,其中modelType是您可以识别的字段,您正在使用的基类的子类:
@JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM,
include = JsonTypeInfo.As.PROPERTY,
property = "modelType")
@JsonTypeIdResolver(IdResolver.class)
interface IPolymorphic
2.实现自己的IdResolver.class :
public class IdResolver implements TypeIdResolver {
private JavaType baseType = null;
@Override
public void init(JavaType baseType) {
this.baseType = baseType;
}
@Override
public String idFromValue(Object value) {
return idFromValueAndType(value, value.getClass());
}
@Override
public String idFromValueAndType(Object value, Class> suggestedType) {
String id = "";
for (Map.Entry> entry : PolymorphicTypeRegistry.Companion.getInstance().getMap().entrySet()) {
if (entry.getValue() == suggestedType) return entry.getKey();
}
return id;
}
@Override
public String idFromBaseType() {
return idFromValueAndType(null, baseType.getRawClass());
}
@Override
public JavaType typeFromId(String id) {
Class clazz = PolymorphicTypeRegistry.Companion.getInstance().get(id);
JavaType javaType = TypeFactory.defaultInstance().constructSpecializedType(baseType, clazz);
return javaType;
}
@Override
public JavaType typeFromId(DatabindContext context, String id) {
return typeFromId(id);
}
@Override
public String getDescForKnownTypeIds() {
return "";
}
@Override
public JsonTypeInfo.Id getMechanism() {
return JsonTypeInfo.Id.CUSTOM;
}
}
在之前的两个步骤中,我们配置jackson为所有嵌套的IPolymorphic类调用相同的反序列化行为,所以最后一步 - 我们需要为IPolymorphic注册反序列化器:public void configureJackson() { ObjectMapper objectMapper = new ObjectMapper(); Module module = new SimpleModule(); module.addDeserializer(IPolymorphic.class, new PolymorphicJsonDeserializer()); objectMapper.registerModule(module); }