天增的博客
首页
博客
  • 分布式解决方案
  • Java并发工具包
  • redis
  • LeetCode
  • 系统设计
  • JVM体系
Github (opens new window)
Rss (opens new window)
首页
博客
  • 分布式解决方案
  • Java并发工具包
  • redis
  • LeetCode
  • 系统设计
  • JVM体系
Github (opens new window)
Rss (opens new window)
  • posts
  • Jackson序列化继承Map类型的字段
2023-02-07

Jackson序列化继承Map类型的字段

如果有一个类继承了Map类型的数据,并且这个继承的这个类包含额外的字段,就想下面这样:

class FlowNode extends LinkedHashMap{
    String id
    String name
    String renderKey
    String label
    String parentKey
}

在序列化之后,FlowNode中的所有属性值全部都是空。

如果想要正确的获取到序列化之后的值,通常有两种方式:

  1. 将动态的字段封装成一个额外的字段

    class FlowNode {
        String id
        String name
        String renderKey
        String label
        String parentKey
        Map extra
    }
    
  2. 遵循Map的使用规则重写Get、Set方法

    class FlowNode extends LinkedHashMap{
        String id
        String getId(){
    	return (String) get('id');
        }
        void setId(String id){
    	return set('id');
        }
    }
    
    

很显然这两种方式都不够友好,得益于Jackson强大的定制化功能,还能够使用下面这种方式;

在位置字段的情况下,把所有数据通过注解保存到额外的additionalProperties​属性中,无论在序列化还是反序列化的时候都能够正确输出结果

class FlowNode {
    String id
    String name
    String renderKey
    String label
    String parentKey

    FormItem[] form

    private HashMap<String, Object> additionalProperties = new HashMap<>();

    @JsonAnyGetter
    Map<String, Object> any() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    void set(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}

‍

最近更新
01
Gradle Java和Groovy混编
02-06
02
springboot配置HttpMessageConverter
01-30
03
InnoDB存储引擎之内存管理
11-03
更多文章>
Theme by Vdoing | Copyright © 2015-2023 天增 | 苏ICP备16037388号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式