用JsonTypeInfo处理Jackson反序列化的java。Id.NAME
当我使用配置为的ObjectMapper时:
DefaultTyping applicability = ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT;
TypeResolverBuilder<?> typer = DefaultTypeResolverBuilder.construct(applicability, validator);
String propertyName = "type";
typer = typer.init(JsonTypeInfo.Id.NAME, null);
typer = typer.inclusion(JsonTypeInfo.As.PROPERTY);
typer = typer.typeProperty(propertyName);
ObjectMapper mapper=new ObjectMapper();
mapper.setDefaultTyping(typer);
它生成类似于JSON的内容:
{
"type": "ShortClassName",
...
}
该类型没有预期的完整包名。但是,尝试使用此对象映射器反序列化会导致:
com.fasterxml.jackson.databind.exc.InvalidTypeIdException
如何将基本包名指定为对象映射器配置的一部分,以便序列化的JSON只有类名
# 1 楼答案
通过使用
mapper.readerFor(...)
并指定要提取的类型,可以为特定对象创建映射器,在本例中,这将是其中
ShortClassName
是您的类名然后您可以使用这个
ObjectReader
和readValue
来反序列化JSON# 2 楼答案
谢谢Ayk——如果类名本身就是要反序列化的类名,那么您的解决方案可以工作,但是如果它嵌套在另一个类的JSON中,那么它就不工作。然而,我通过定义一个自定义的
typeIdResolver
,分别将ID从idFromValue
和typeFromId
中的对象转换为/来实现它。这样就可以在全局范围内工作,而不需要对序列化中涉及的每个对象进行注释