gpt4 book ai didi

json - 如何自定义 Jackson 类型信息机制

转载 作者:行者123 更新时间:2023-12-04 17:37:56 28 4
gpt4 key购买 nike

在 jackson ,我使用注解 @JsonTypeInfo 包括多态性支持。

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

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

我需要的 ,

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

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

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

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

    Example 的帮助会很好。

    最佳答案

    您可以使用 jackson 的 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;
    }
    }

    现在,假设您有 Foo.javatest.jackson包和 Bar.javaorg.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));

    相应的输出将是:
    {"@CLASS":"test.jackson.Foo","integer":10,"string":"Foo"}
    {"integer":20,"string":"Bar"}

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

    关于json - 如何自定义 Jackson 类型信息机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353774/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com