5

在 Jackson 中,我使用注释@JsonTypeInfo来包含多态性支持。

如果我不想使用基于注释的方法,我可以使用全局默认类型或覆盖类型信息处理模块。

我已经尝试过全局类型信息,但它正在为所有非最终类型发出类型信息。

我需要的 ,

  1. 我只想包含多态类型的类型信息。
  2. 我想更改类型信息的默认格式(键值对)

是否可以仅通过 twitting 全局配置来实现以上两点?

如果不是,我应该使用什么扩展点来自定义类型信息模块?我读过JacksonAnnotationIntrospector是处理类型信息的类。

我应该自定义它以实现上述两点吗?

Example 的帮助会很好。

4

2 回答 2

11

DefaultTypeResolverBuilder为此,您可以使用 Jackson's 。扩展此类并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;
    }
}

现在,考虑你有Foo.javain test.jacksonpackage 和Bar.javain org.myorgpackage,每个都包含一个int名为“integer”的String变量和一个名为“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));

相应的输出将是:

{"@CLASS":"test.jackson.Foo","integer":10,"string":"Foo"}
{"integer":20,"string":"Bar"}

您还可以自定义表示类型的属性的名称(上例中的“@CLASS”)。希望这可以帮助!

于 2013-07-29T18:56:54.557 回答
0

您可以使用Moonwlker库。

有了它,你可以创建一个ObjectMapper这样的:

 ObjectMapper objectMapper = new ObjectMapper();

 MoonwlkerModule module =
   MoonwlkerModule.builder()
     .fromProperty("@CLASS").toSubclassesOf(Animal.class)
     .build();

 objectMapper.registerModule(module);

然后使用该映射器进行(反)序列化。Moonwlker 网站包含更多详细信息和配置选项。

于 2020-06-10T20:58:11.517 回答