繁体   English   中英

Jackson将类名序列化为所有对象的属性

[英]Jackson serialize class name as property for all objects

我想将所有POJO Jackson的类名序列化为JSON对象,以将其作为相应对象的属性包含在内。 理想情况下,这应该通过ObjectMapper或某些类似的常规设置来实现。

序列化示例:

public class MyClass {
  private String someField;
  private MyOtherClass anotherField;
}

{
  "$type": "MyClass",
  "someField": "abc",
  "anotherField": {
    "$type": "MyOtherClass",
    ...
  }
}

我知道这也可以通过用类似的注释所有相应的类来完成

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "$type")

但我想避免这种情况。

我也尝试过

objectMapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, "$type")

这似乎没有用。

有这样的常规设置吗?


编辑:感谢AZWN的提示,通过使用DefaultTyping.NON_FINAL定制和构造TypeResolverBuilder ,我实际上得到了我想要的TypeResolverBuilder

StdTypeResolverBuilder typer = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL) {
    @Override
    public boolean useForType(JavaType t) {
        return !(t.isCollectionLikeType() || t.isMapLikeType()) && super.useForType(t);
    }
}
        .init(JsonTypeInfo.Id.NAME, null)
        .inclusion(JsonTypeInfo.As.PROPERTY)
        .typeProperty("$type");

objectMapper.setDefaultTyping(typer);

您应该使用ObjectMapper.DefaultTyping.NON_FINAL而不是ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT ,因为当编译时类的字段类型Object时,后者仅包括类型属性。

有关更多信息,请参阅docs 另外,请注意他们提到的安全问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM