Jackson动态扩展自定义字段

简介: 在日常开发中,会有些字段经常发生变化的类,但是每次都要修改数据传输类,例如前端需要额外新增一个 参数响应,或者业务上需要调整某些动态的字段等等,那如何解决此类问题呢。

前言

image.png
在日常开发中,会有些字段经常发生变化的类,但是每次都要修改数据传输类,例如前端需要额外新增一个 参数响应,或者业务上需要调整某些动态的字段等等,那如何解决此类问题呢。

Example

定义了一个用户的实体类User,类中只有 id、name 两个字段:
@Data
public class User {
    private String id;
    private String name;
}

但是在业务上,用户可以根据需要添加一些自定义属性,比如age、address等,因为业务不确定,所以我们也没办法提前在类中定义这些属性。

  那么处理方式也简单,如下所示。
@Data
public class User {
    private String id;
    private String name;
    // 扩展字段
    private Map<String, String> extFields = Maps.newHashMap();
}
序列化后,如下所示。
{
  "id": "100001",
  "name": "小明",
  "extFields": {
    "address": "浙江省杭州市",
    "age": "22"
  }
}
可以看到自定义的字段都是在extFields中,但是你可能想要的是如下结构:
{
  "id": "100001",
  "name": "小明",
  "address": "浙江省杭州市",
  "age": "22"
}

@JsonAnyGetter &  @JsonAnySetter

  • JsonAnyGetter:在getter方法上使用,此方法返回一个map对象,序列化的时候,此map所有的键值对,都会与对象的成员变量同级。
  • JsonAnySetter:在setter方法上使用,此方法为键值对,反序列化的时候,所有不包含在此对象中的未知属性,都会调用此方法进行设置。
使用方法如下所示。
public class User {
    private String id;
    private String name;
    // 扩展字段
    private Map<String, String> extFields = Maps.newHashMap();

    @JsonAnyGetter
    public Map<String, String> getExtFields() {
        return extFields;
    }

    @JsonAnySetter
    public void setExtFields(String key, String value) {
        this.extFields.put(key, value);
    }
    
}

需要注意的是setExtFields方法的参数,不能直接传递extFields字段,因为传过来的Json中很可能是没有这个字段的,所以可以提供两个参数key和value,反序列化时,@JsonAnySetter会自动把自定义的属性添加到extFields字段中。详见:Jackson @JsonAnyGetter and @JsonAnySetter Example

目录
相关文章
|
fastjson 前端开发
巧用fastjson自定义序列化类实现字段的转换
项目中突然需要增加另一个字段的查找,而这个查找需要查另一张表的记录。 但现在产品很多地方都要增加该字段,如何最快的实现该功能呢。 办法如下: 通过fastjson序列化时,增加该字段的序列化类,该序列化类通过CODE查找名称,并序列化到前端。
5816 0
|
24天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
3月前
|
缓存 Java 数据库连接
扩展类的附加特性
扩展类的附加特性
21 0
|
4月前
|
Java 数据库连接 数据库
Hibernate 支持哪些不同类型的关系?
【8月更文挑战第21天】
34 0
|
7月前
|
Java 微服务
|
7月前
ES6对象新增了哪些扩展?
ES6对象新增了哪些扩展?
65 0
|
存储 XML SQL
浅谈扩展字段设计
浅谈扩展字段设计
434 0
ES6中对象新增了哪些扩展?
ES6中,当对象键名与对应值名相等的时候,可以进行简写
|
SQL Java 数据库连接
MyBatis动态数据源配置(动态配置字段,库 适合简单逻辑)
MyBatis动态数据源配置(动态配置字段,库 适合简单逻辑)
150 0
使用hutool中的树形结构api时自定义扩展属性
使用hutool的树结构工具时,其内置的TreeNode类只有固定的几个属性,想添加自定义属性怎么办?