为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿晨1998 2023-06-28 15:43:53
我希望 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);
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

您应该使用ObjectMapper.DefaultTyping.NON_FINAL而不是ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT,因为后一个仅在类的字段类型处于编译时时才Object包含类型属性。


查看完整回答
反对 回复 2023-06-28
  • 1 回答
  • 0 关注
  • 245 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号