目录
[1. 核心转换场景](#1. 核心转换场景)
[2. 核心处理框架](#2. 核心处理框架)
[3. 关键前提:JavaBean 规范与 getter/setter](#3. 关键前提:JavaBean 规范与 getter/setter)
写项目时各种model上的注解,以及数据传输相关的知识总让我感到一知半解。因此这里借助ai写下学习笔记,一文彻底搞懂。
数据传输转换的核心概念
1. 核心转换场景
前后端 / 跨服务数据传输的核心是「Java 对象 」与「JSON 字符串」的双向转换,对应两个专业术语:
-
序列化(Serialization):Java 对象 → JSON 字符串/字节流/字符流(后端返回数据给前端 / 跨服务发送数据)。
-
反序列化(Deserialization):JSON 字符串/字节流/字符流 → Java 对象(前端提交数据给后端 / 跨服务接收数据)。
2. 核心处理框架
在 Spring Boot/Spring MVC 项目中,主流的 JSON 处理框架有 3 个,也是注解的核心来源:
-
Jackson :Spring Boot 默认集成(无需额外引入依赖),包路径
com.fasterxml.jackson,核心注解@JsonProperty等,是开发中的「标配」。 -
FastJSON :阿里开源(需额外引入依赖),包路径
com.alibaba.fastjson,核心注解@JSONField等,适合复杂 JSON 的手动处理。 -
Hutool JSON :Hutool 工具库封装的 JSON 工具(需引入 Hutool 依赖),包路径
cn.hutool.json,核心注解@Alias,主要用于快速便捷的 JSON 处理,兼容性强。 -
Mybatis-plus:实现Java实体对象与数据库表之间的双向数据传输与yin
3. 关键前提:JavaBean 规范与 getter/setter
无论哪个框架,JSON 转换的核心都不直接依赖 Java 类的「字段名」 ,而是依赖「JavaBean 规范的 getter/setter 方法」(通过反射获取),再通过方法名反推「JavaBean 属性名」,最终完成与 JSON 字段的映射。
-
Lombok 的
@Data、@Getter、@Setter注解能自动生成符合规范的 getter/setter,是 JSON 转换的基础(无需手动编写,避免冗余)。 -
若没有 getter/setter(如字段用
private修饰且无对应方法),框架无法反射获取字段,转换会失败(字段为null)。
4.常见的数据传输场景
1.前后端 JSON 传输(Jackson/FastJSON)
- 数据库存储 持久化传输(MyBatis-Plus)--只需要提取属性值生成 SQL,数据库存储结构化字段,不是存储对象字节流
3.Java 对象存文件(Serializable)--Redis是保存对象二进制字节流
无注解:默认数据转换的条件与规则
- 无注解正常转换的 4 个核心条件
| 条件 | 具体要求 | 示例 |
|---|---|---|
| 字段命名规范 | 采用「普通全小写」或「标准普通驼峰」(首字母小写,第二个字母也小写,后续单词首字母大写),无命名歧义 | 全小写:id、name;普通驼峰:reviewStatus、userName、imageUrl |
| getter/setter 存在 | 字段有对应的 getter/setter 方法(Lombok @Data 自动生成,符合 JavaBean 规范) |
字段reviewStatus → 生成getReviewStatus()、setReviewStatus() |
| 数据类型兼容 | 字段类型是框架「内置支持」的常见类型,无需自定义转换规则 | 基本类型包装类(Long、Integer)、String、集合(List、Map)、数组等 |
| JSON 字段名匹配 | 前端传递 / 接收的 JSON 字段名,与框架推断的「JavaBean 属性名」一致(或框架支持大小写不敏感匹配) | Java 属性名reviewStatus → JSON 字段名reviewStatus(一致)或reviewstatus(大小写兼容) |
-
Jackson 默认映射规则(核心,Spring MVC 默认)
-
优先通过 getter/setter 方法反推 JavaBean 属性名:去掉
get/set前缀,第一个字母转为小写,后续字母保持不变(如getReviewStatus()→reviewStatus)。 -
JSON 字段名与 JavaBean 属性名「完全匹配」时,精准映射;默认支持「大小写不敏感」的模糊匹配(如
ReviewStatus、REVIEWSTATUS→ 均能映射到reviewStatus)。 -
忽略 Java 类中「无 getter/setter 的字段」和「transient 修饰的字段」。
-
序列化时,默认返回
null值字段;反序列化时,忽略 JSON 中不存在的字段(Java 字段保持默认值,如null、0)。 -
注意:
Serializable接口与 JSON 转换无关
类上的implements Serializable和serialVersionUID,仅用于「Java 对象的字节流序列化」(如存文件、分布式缓存传输),与 JSON 转换(字符流)毫无关系,即使删除,JSON 转换也能正常工作。
需要注解的场景
当「默认转换无法满足需求」时,就需要通过注解干预,常见问题分为 4 类,也是注解的核心应用场景:
场景 1:字段命名不一致(最常用)
问题现象 :Java 遵循「驼峰式」,前端 / 第三方接口遵循「下划线式」,默认无法映射,字段为null。
-
Java 字段:
imageUrl(驼峰) -
JSON 字段:
image_url(下划线)
问题根源 :字段名格式不一致,框架无法自动匹配。解决方案:使用映射注解,指定两者的对应关系。
场景 2:字段命名有歧义(特殊驼峰)
问题现象:Java 字段是「首字母小写,第二个字母大写」(特殊驼峰),框架推断属性名出错,前端传同名驼峰无法映射,传全小写反而成功。
-
Java 字段:
xScale、eMail(特殊驼峰) -
问题根源:Lombok 生成的 getter/setter(如
getXScale())不符合严格 JavaBean 规范,框架推断出的属性名(如XScale)与预期不符。解决方案:使用注解强制指定映射关系,跳过框架自动推断。
场景 3:自定义转换需求
问题现象 :需要隐藏敏感字段、忽略null值、自定义 JSON 字段名、控制序列化 / 反序列化顺序等。
-
示例 1:用户密码
password,序列化时不返回给前端。 -
示例 2:Java 字段
userId,希望 JSON 字段名为uid。解决方案:使用对应的功能注解,实现自定义需求。
场景 4:复杂数据类型转换
问题现象:字段类型是框架「不默认支持」的复杂类型,默认转换失败(如日期、自定义枚举、自定义对象)。
-
示例 1:Java 字段
LocalDateTime createTime,JSON 字段"create_time": "2024-05-01 12:00:00",默认无法转换。 -
示例 2:自定义枚举
OrderStatus,JSON 传递数字1,希望映射为枚举常量SUCCESS。解决方案:使用格式化 / 转换注解,或配置全局转换器。
核心注解整理
- 核心框架:Jackson(Spring MVC 默认,优先使用)
Jackson 的注解是开发中的「标配」,仅对 Jackson 框架生效(Spring MVC 自动转换、手动使用ObjectMapper转换),核心注解如下:
| 注解 | 作用场景 | 核心功能 | 示例 |
|---|---|---|---|
@JsonProperty |
序列化 / 反序列化(核心) | 1. 指定 JSON 字段名与 Java 字段的映射关系;2. 跳过框架自动属性推断,解决命名歧义 / 不一致问题;3. 控制字段是否序列化(access属性) |
@JsonProperty("image_url")``private String imageUrl;``@JsonProperty("xScale")``private Float xScale; |
@JsonIgnore |
序列化 / 反序列化 | 忽略指定字段,不参与 JSON 转换(隐藏敏感字段) | @JsonIgnore``private String password; |
@JsonFormat |
序列化 / 反序列化(日期 / 数字格式化) | 自定义复杂类型的格式化规则,最常用「日期格式化」 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")``private LocalDateTime createTime; |
@JsonAlias |
反序列化(仅输入) | 为 Java 字段指定多个 JSON 别名,前端传任意别名都能映射(序列化时仍输出 Java 字段名 /@JsonProperty指定的名称) |
@JsonAlias({"user_name", "username"})``private String userName; |
@JsonInclude |
序列化(仅输出) | 控制null值 / 空值字段是否返回给前端,常用JsonInclude.Include.NON_NULL(忽略null值) |
类级别(全局):@JsonInclude(JsonInclude.Include.NON_NULL)``public class User {}字段级别(单个):@JsonInclude(JsonInclude.Include.NON_NULL)``private String introduction; |
- 常用框架:FastJSON(阿里,手动转换)
FastJSON 的注解仅对 FastJSON 工具(JSON.toJSONString()、JSON.parseObject())生效,核心注解:
| 注解 | 作用场景 | 核心功能 | 示例 |
|---|---|---|---|
@JSONField |
序列化 / 反序列化(核心) | 等价于 Jackson 的@JsonProperty+@JsonFormat,支持:1. 字段映射(name属性);2. 日期格式化(format属性);3. 忽略字段(serialize=false) |
@JSONField(name = "image_url", format = "yyyy-MM-dd")``private String imageUrl;``@JSONField(serialize = false)``private String password; |
- 工具类:Hutool(兼容,快速转换)
Hutool 的@Alias注解仅对 Hutool 的 JSON 工具(JSONUtil.toJsonStr()、JSONUtil.toBean())生效,核心注解:
| 注解 | 作用场景 | 核心功能 | 注意点 |
|---|---|---|---|
@Alias |
序列化 / 反序列化 | 解决字段命名不一致,实现 Java 字段与 JSON 字段的映射 | 1. 仅对 Hutool 工具生效,Spring MVC(Jackson)不识别;2. 多框架兼容时,需与@JsonProperty并存 |
- 基础注解:Lombok(影响 getter/setter,间接影响转换)
Lombok 注解不直接参与 JSON 转换,但影响 getter/setter 的生成,进而影响框架的属性推断,核心注解:
| 注解 | 核心功能 | 对 JSON 转换的影响 |
|---|---|---|
@Data |
自动生成 getter/setter、toString()、equals()等 |
生成符合 JavaBean 规范的 getter/setter,是 JSON 转换的基础(必备) |
@Getter/@Setter |
单独为字段生成 getter/setter | 按需生成,缺失则对应字段无法参与 JSON 转换 |
@Accessors(chain = true) |
开启链式调用(setter 返回this) |
不影响 JSON 转换(框架仅关心 getter/setter 的存在,不关心返回值) |
多框架兼容方案:一处注解,多处生效
实际开发中,可能同时混用「Jackson(Spring MVC 自动转换)」、「FastJSON(手动处理)」、「Hutool(快速转换)」,此时需要「多注解并存」,实现兼容,核心方案:
方案:核心字段添加「跨框架注解组合」
java
import cn.hutool.core.bean.Alias;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class PictureRequest implements Serializable {
// 同时添加3个注解,兼容Jackson、FastJSON、Hutool
@Alias("image_url") // Hutool 识别
@JSONField(name = "image_url") // FastJSON 识别
@JsonProperty("image_url") // Jackson 识别(Spring MVC 默认)
private String imageUrl;
// 特殊驼峰字段,同样兼容多框架
@Alias("x_scale")
@JSONField(name = "x_scale")
@JsonProperty("xScale")
private Float xScale;
}
效果:
-
Spring MVC 接口自动转换(Jackson):正常映射
image_url、xScale。 -
手动使用 FastJSON 转换:正常映射
image_url、x_scale。 -
手动使用 Hutool 转换:正常映射
image_url、x_scale。
总结
-
数据传输的核心是「Java 对象↔JSON」的序列化 / 反序列化,Spring MVC 默认依赖 Jackson 框架。
-
无注解正常转换的核心是「字段命名规范 + getter/setter 存在 + JSON 字段名匹配」,普通驼峰 / 全小写字段无需额外配置。
-
注解是「补充手段」,仅用于解决「命名不一致 / 歧义」、「自定义转换需求」、「多框架兼容」等问题。
-
核心注解:Jackson
@JsonProperty(映射核心)、FastJSON@JSONField、Hutool@Alias,多框架兼容需组合使用。 -
最佳实践:统一命名规范、优先使用 Jackson、全局配置替代单个注解,从源头减少转换问题。
