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查找名称,并序列化到前端。
5727 0
|
2月前
|
数据库
掌握数据模型的精细控制:深入探索Entity Framework Core中的自定义类型转换器与值转换器
【8月更文挑战第31天】在软件开发中,数据模型常需在数据库类型与 .NET 类型之间进行映射。尽管 Entity Framework Core 提供了默认的类型映射,但在某些情况下,我们可能需要自定义映射规则。这时,类型转换器和值转换器就派上了用场。本文将介绍如何在 EF Core 中使用自定义类型转换器和值转换器,以实现更灵活的数据映射。
12 0
|
4月前
Mapstruct自定义转换规则
Mapstruct自定义转换规则
111 1
|
4月前
|
JSON 数据格式
详解Jackson的动态属性设置@JsonAnyGetter和@JsonAnySetter
详解Jackson的动态属性设置@JsonAnyGetter和@JsonAnySetter
|
5月前
|
Java 微服务
|
5月前
ES6对象新增了哪些扩展?
ES6对象新增了哪些扩展?
59 0
|
存储 XML SQL
浅谈扩展字段设计
浅谈扩展字段设计
388 0
ES6中对象新增了哪些扩展?
ES6中,当对象键名与对应值名相等的时候,可以进行简写
|
SQL Java 数据库连接
MyBatis动态数据源配置(动态配置字段,库 适合简单逻辑)
MyBatis动态数据源配置(动态配置字段,库 适合简单逻辑)
131 0
使用hutool中的树形结构api时自定义扩展属性
使用hutool的树结构工具时,其内置的TreeNode类只有固定的几个属性,想添加自定义属性怎么办?