当前位置: 首页 > news >正文

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

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

一、@JsonAlias 的作用

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

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

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

假设你有一个 User 类,它的字段可以接收多个不同的 JSON 键名。例如,可能存在 “名称” “名字”,它们都应该映射到 name 字段。
在这里插入图片描述

import com.fasterxml.jackson.annotation.JsonAlias;public class User {@JsonAlias({"名称", "名字"})private String name;@JsonAlias({"年龄", "岁数"})private int age;@JsonAlias({"性别", "性"})private String gender;// Getters and Setterspublic 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 数据可能是以下两种形式之一:

{"名字": "张三","岁数": 30,"性": "男"
}

或者:

{"名称": "李四","年龄": 25,"性别": "女"
}

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

控制器中的使用
在这里插入图片描述

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

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

@JsonAlias 在反序列化中处理多个别名:适用于处理不同 JSON 格式或处理 JSON 键名变化的场景。
便捷性:通过 @JsonAlias,无需在代码中手动处理不同的键名映射,Jackson 会自动完成这项工作。
增强灵活性:可以更灵活地处理外部输入的数据格式,确保应用程序的兼容性和健壮性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 修改了原神4.8版本升级数据表
  • 关于前端form提交后端返回文件流触发浏览器下载(并发控制)
  • 程序员常用的10种算法
  • Pandas DataFrame 数据转换处理和多条件查询
  • 【模板】连接外围数据库
  • Java高效写入大量数据到Excel文件——使用Apache POI的SXSSFWorkbook
  • WIFI 频段及信道简介
  • 【摆脱被360安全卫士荼毒:使用这2个软件就够了】
  • GoFly快速开发后台框架当后端接口请求返回403提示码就跨域问题/请求端域名拦截问题
  • [数据集][目标检测]电力场景红外图像输电线路绝缘子检测数据集VOC+YOLO格式1846张1类别
  • 认识泛型VS包装类
  • 第5章 虚拟机的安装和使用
  • MyBatis-Plus 一、(基础应用)
  • ROS2常用指令
  • 探索ISP自动曝光技术:工作原理与应用(一)
  • Android系统模拟器绘制实现概述
  • Angular2开发踩坑系列-生产环境编译
  • es的写入过程
  • Flex布局到底解决了什么问题
  • Js基础——数据类型之Null和Undefined
  • opencv python Meanshift 和 Camshift
  • React as a UI Runtime(五、列表)
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 大快搜索数据爬虫技术实例安装教学篇
  • 警报:线上事故之CountDownLatch的威力
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 数据仓库的几种建模方法
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用element的upload组件实现多图片上传和压缩
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 数据可视化之下发图实践
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​一些不规范的GTID使用场景
  • #etcd#安装时出错
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (4)(4.6) Triducer
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (arch)linux 转换文件编码格式
  • (分布式缓存)Redis持久化
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一)插入排序
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)VC++中ondraw在什么时候调用的
  • (转)四层和七层负载均衡的区别
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net refrector
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值