Jackson动态扩展自定义字段

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

前言

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

Example

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

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

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

@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);
    }
    
}
AI 代码解读

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

目录
打赏
0
0
0
0
569
分享
相关文章
SpringBoot 代码混淆方案 ProGuard
在软件开发中,代码混淆是故意创建人类难以理解的源代码或机器代码的行为。代码混淆处理修改了可部署的文件,因此黑客很难从中读取信息,但仍然保持完整的功能。这最初是为 android 平台引入的。它现在能够支持 SpringBoot 2。
使用Mybatis报错:java.lang.NullPointerException排查方案
使用Mybatis报错:java.lang.NullPointerException排查方案
2245 0
使用Mybatis报错:java.lang.NullPointerException排查方案
SpringBoot WebSocket大揭秘:实时通信、高效协作,一文让你彻底解锁!
【8月更文挑战第25天】本文介绍如何在SpringBoot项目中集成WebSocket以实现客户端与服务端的实时通信。首先概述了WebSocket的基本原理及其优势,接着详细阐述了集成步骤:添加依赖、配置WebSocket、定义WebSocket接口及进行测试。通过示例代码展示了整个过程,旨在帮助开发者更好地理解和应用这一技术。
633 1
vanna+qwen实现私有模型的SQL转换
本文档介绍了如何在本地部署Vanna服务以使用Qwen模型进行text2sql转换。首先,通过`snapshot_download`下载Qwen-7B-Chat模型,并安装相关依赖。接着,修改`openai_api.py`设置本地LLM服务接口。然后,安装并配置Vanna Flask服务,包括自定义LLM服务、连接数据库以及修改端口。为了解决内网访问问题,使用ngrok或natapp进行内网穿透,提供公网访问。最后,处理了chromadb包中自动下载资源的问题,以防网络不佳导致的失败。通过这些步骤,实现了使用本地Qwen模型的Vanna服务。
9774 9
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问