【注解】反序列化时匹配多个 JSON 属性名 @JsonAlias 详解

@JsonAlias 注解是 Jackson 提供的一个功能强大的注解,允许一个字段在反序列化时匹配多个 JSON 属性名。它适用于在处理多种输入数据格式时,或当 JSON 数据的键名可能变化时。

一、@JsonAlias 的作用

  • 多种别名:@JsonAlias 允许你为一个字段定义多个可能的 JSON 键名,这在 JSON 数据的键名有多种可能时非常有用。
  • 反序列化:在反序列化时,如果 JSON 中的键名与 @JsonAlias 中定义的别名之一匹配,Jackson
    就会把这个键的值赋给对应的字段。
  • @JsonAlias 的作用除了上述两个之外,也同 @JsonProperty ,详情参考---> 【注解】@JsonProperty 详解

二、示例:使用 @JsonAlias 来处理多个键名

真实使用场景---> 数据库存的JSON数据转为Map,key值是中文,转成英文,转为json数据传给前端

假设你有一个 User 类,它的字段可以接收多个不同的 JSON 键名。例如,可能存在 "名称" 或 "名字",它们都应该映射到 name 字段。

java 复制代码
import com.fasterxml.jackson.annotation.JsonAlias;

public class User {
    @JsonAlias({"名称", "名字"})
    private String name;

    @JsonAlias({"年龄", "岁数"})
    private int age;

    @JsonAlias({"性别", "性"})
    private String gender;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

使用示例

假设你接收到的 JSON 数据可能是以下两种形式之一:

javascript 复制代码
{
    "名字": "张三",
    "岁数": 30,
    "性": "男"
}

或者:

javascript 复制代码
{
    "名称": "李四",
    "年龄": 25,
    "性别": "女"
}

@JsonAlias 会处理这两种情况,并将它们都映射到 User 对象中相应的字段上。

控制器中的使用

java 复制代码
@RestController
@RequestMapping("/api")
public class UserController {

    @PostMapping("/user")
    public User createUser(@RequestBody User user) {
        // 此时 user 对象已经根据别名进行了正确的映射
        return user;  // 可以返回给前端,或者进行其他业务处理
    }
}

前端处理

无论前端发送的是 "名字" 还是 "名称",后端都可以正确处理并将其映射到 name 字段上。

@JsonAlias 在反序列化中处理多个别名:适用于处理不同 JSON 格式或处理 JSON 键名变化的场景。

便捷性:通过 @JsonAlias,无需在代码中手动处理不同的键名映射,Jackson 会自动完成这项工作。

增强灵活性:可以更灵活地处理外部输入的数据格式,确保应用程序的兼容性和健壮性。

相关推荐
无心水43 分钟前
【OpenClaw:实战部署】5、全平台部署OpenClaw(Win/Mac/Linux/云服务器)——10分钟跑通第一个本地AI智能体
java·人工智能·ai·智能体·ai智能体·ai架构·openclaw
一只大袋鼠1 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
※DX3906※2 小时前
Java排序算法--全面详解面试中涉及的排序
java·开发语言·数据结构·面试·排序算法
cur1es3 小时前
【JVM类加载&双亲委派模型&垃圾回收机制】
java·jvm·gc·垃圾回收·类加载·双亲委派模型
Mr.朱鹏3 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
焦糖玛奇朵婷4 小时前
实测扭蛋机小程序:开发简单,互动有趣
java·大数据·程序人生·小程序·软件需求
Nan_Shu_6144 小时前
学习: 尚硅谷Java项目之小谷充电宝(3)
java·后端·学习
wzqllwy4 小时前
8 大经典排序算法(Java 实现):原理 + Demo + 核心分析
java·算法·排序算法
智能工业品检测-奇妙智能4 小时前
AIFlowy如何实现与现有Spring Boot项目的无缝集成?
java·spring boot·后端
從南走到北4 小时前
JAVA无人共享无人健身房物联网结合系统源码支持小程序+公众号+APP+H5
java·物联网·小程序