我需要帮助,这里是任务的描述:
1.我有基本界面
interface IPolymorphicModel
2。我有几个嵌套接口:
interface IContentItem extends IPolymorphicModel
interface IAttachment extends IPolymorphicModel
3。我的实现很少:
public class MediaAttachment implements IAttachment
public class Article implements IContentItem {
private List<IAttachment> attachements;
}
我正在使用jackson(我也尝试Gson
使用registerTypeAdapterFactory
)来解析当前的json结构。我正在使用下一种方法对所有嵌套项使用单个反序列化器反序列化json:
Module module = new SimpleModule()
module.setDeserializerModifier(new BeanDeserializerModifier() {
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
BeanDescription beanDesc,
JsonDeserializer<?> deserializer){
if (IPolymorphicModel.class.isAssignableFrom(beanDesc.getBeanClass())){
return new PolymorphicJsonDeserializer()
}
return super.modifyDeserializer(config, beanDesc, deserializer);
})
但是解析内部项有问题:因为你可以看到内部对象可以包含具有相同super
的对象,并且当jackson尝试解析它们时它对{{1}一无所知<},并且注册相同的IPolymorphicModel
是不可能的,因为它会导致堆栈溢出。
答案 0 :(得分:0)
我找到了解决方案。至少在这种情况下它很容易。要解决此类任务,您需要使用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<String, Class<? extends IPolymorphic>> 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);
}