在Jackson中,我使用注释@JsonTypeInfo来包含多态支持.
如果,我不想使用基于注释的方法,我可以使用全局默认类型或覆盖类型信息处理模块.
我尝试了全局类型信息,但它为所有非最终类型发出类型信息.
我需要的 ,
是否可以通过扭曲全局配置来实现以上两点?
如果没有,我应该使用什么扩展点来定制类型信息模块?我读过JacksonAnnotationIntrospector是处理类型信息的类.
我应该定制它来实现上述两点吗?
帮助示例将是好的和良好的.
您可以将杰克逊DefaultTypeResolverBuilder用于此目的.扩展此类并useForType适当地覆盖该方法.这是一个仅为属于test.jackson包(和子包)的类添加类型信息的示例:
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTypeResolverBuilder;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
public class CustomTypeResolverBuilder extends DefaultTypeResolverBuilder
{
public CustomTypeResolverBuilder()
{
super(DefaultTyping.NON_FINAL);
}
@Override
public boolean useForType(JavaType t)
{
if (t.getRawClass().getName().startsWith("test.jackson")) {
return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,假设你有Foo.java在test.jackson封装Bar.java中org.myorg封装,每片含一个int名为"整数"变量和一个String名为"字符串"变量.
您可以通过以下方式序列化这两个类的对象:
ObjectMapper objectMapper = new ObjectMapper();
TypeResolverBuilder<?> typeResolver = new CustomTypeResolverBuilder();
typeResolver.init(JsonTypeInfo.Id.CLASS, null);
typeResolver.inclusion(JsonTypeInfo.As.PROPERTY);
typeResolver.typeProperty("@CLASS");
objectMapper.setDefaultTyping(typeResolver);
Foo foo = new Foo(10, "Foo");
Bar bar = new Bar(20, "Bar");
System.out.println(objectMapper.writeValueAsString(foo));
System.out.println(objectMapper.writeValueAsString(bar));
Run Code Online (Sandbox Code Playgroud)
相应的输出将是:
{"@CLASS":"test.jackson.Foo","integer":10,"string":"Foo"}
{"integer":20,"string":"Bar"}
Run Code Online (Sandbox Code Playgroud)
您还可以自定义表示类型的属性的名称(上例中的"@CLASS").希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
8654 次 |
| 最近记录: |