java多态很复杂,java - 用具有复杂多态结构的Jackson反序列化JSON - 堆栈内存溢出...

我找到了解决方案。 至少在这种情况下它很容易。 要解决此类任务,您需要使用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); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值