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

我希望 Jackson 序列化为 JSON 对象的所有 POJO 的类名作为相应对象的属性包含在内。理想情况下,这应该通过 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")

这似乎不起作用。


有这样通用的设置吗?


我实际上通过自定义和构建一个TypeResolverBuilderwith得到了我正在寻找的东西DefaultTyping.NON_FINAL。


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);


阿晨1998
浏览 246回答 1
1回答

侃侃无极

您应该使用ObjectMapper.DefaultTyping.NON_FINAL而不是ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT,因为后一个仅在类的字段类型处于编译时时才Object包含类型属性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java