【JAVA数据传输】Java 数据传输与转换详解笔记

目录

数据传输转换的核心概念

[1. 核心转换场景](#1. 核心转换场景)

[2. 核心处理框架](#2. 核心处理框架)

[3. 关键前提:JavaBean 规范与 getter/setter](#3. 关键前提:JavaBean 规范与 getter/setter)

4.常见的数据传输场景

无注解:默认数据转换的条件与规则

需要注解的场景:常见数据转换问题

核心注解整理:

总结


写项目时各种model上的注解,以及数据传输相关的知识总让我感到一知半解。因此这里借助ai写下学习笔记,一文彻底搞懂。

数据传输转换的核心概念

1. 核心转换场景

前后端 / 跨服务数据传输的核心是「Java 对象 」与「JSON 字符串」的双向转换,对应两个专业术语:

  • 序列化(Serialization):Java 对象 → JSON 字符串/字节流/字符流(后端返回数据给前端 / 跨服务发送数据)。

  • 反序列化(Deserialization):JSON 字符串/字节流/字符流 → Java 对象(前端提交数据给后端 / 跨服务接收数据)。

2. 核心处理框架

在 Spring Boot/Spring MVC 项目中,主流的 JSON 处理框架有 3 个,也是注解的核心来源:

  1. Jackson :Spring Boot 默认集成(无需额外引入依赖),包路径com.fasterxml.jackson,核心注解@JsonProperty等,是开发中的「标配」。

  2. FastJSON :阿里开源(需额外引入依赖),包路径com.alibaba.fastjson,核心注解@JSONField等,适合复杂 JSON 的手动处理。

  3. Hutool JSON :Hutool 工具库封装的 JSON 工具(需引入 Hutool 依赖),包路径cn.hutool.json,核心注解@Alias,主要用于快速便捷的 JSON 处理,兼容性强。

  4. 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)

  1. 数据库存储 持久化传输(MyBatis-Plus)--只需要提取属性值生成 SQL,数据库存储结构化字段,不是存储对象字节流

3.Java 对象存文件(Serializable)--Redis是保存对象二进制字节流


无注解:默认数据转换的条件与规则

  1. 无注解正常转换的 4 个核心条件
条件 具体要求 示例
字段命名规范 采用「普通全小写」或「标准普通驼峰」(首字母小写,第二个字母也小写,后续单词首字母大写),无命名歧义 全小写:idname;普通驼峰:reviewStatususerNameimageUrl
getter/setter 存在 字段有对应的 getter/setter 方法(Lombok @Data 自动生成,符合 JavaBean 规范) 字段reviewStatus → 生成getReviewStatus()setReviewStatus()
数据类型兼容 字段类型是框架「内置支持」的常见类型,无需自定义转换规则 基本类型包装类(Long、Integer)、String、集合(List、Map)、数组等
JSON 字段名匹配 前端传递 / 接收的 JSON 字段名,与框架推断的「JavaBean 属性名」一致(或框架支持大小写不敏感匹配) Java 属性名reviewStatus → JSON 字段名reviewStatus(一致)或reviewstatus(大小写兼容)
  1. Jackson 默认映射规则(核心,Spring MVC 默认)

  2. 优先通过 getter/setter 方法反推 JavaBean 属性名:去掉get/set前缀,第一个字母转为小写,后续字母保持不变(如getReviewStatus()reviewStatus)。

  3. JSON 字段名与 JavaBean 属性名「完全匹配」时,精准映射;默认支持「大小写不敏感」的模糊匹配(如ReviewStatusREVIEWSTATUS → 均能映射到reviewStatus)。

  4. 忽略 Java 类中「无 getter/setter 的字段」和「transient 修饰的字段」。

  5. 序列化时,默认返回null值字段;反序列化时,忽略 JSON 中不存在的字段(Java 字段保持默认值,如null、0)。

  6. 注意:Serializable接口与 JSON 转换无关

类上的implements SerializableserialVersionUID,仅用于「Java 对象的字节流序列化」(如存文件、分布式缓存传输),与 JSON 转换(字符流)毫无关系,即使删除,JSON 转换也能正常工作。


需要注解的场景

当「默认转换无法满足需求」时,就需要通过注解干预,常见问题分为 4 类,也是注解的核心应用场景:

场景 1:字段命名不一致(最常用)

问题现象 :Java 遵循「驼峰式」,前端 / 第三方接口遵循「下划线式」,默认无法映射,字段为null

  • Java 字段:imageUrl(驼峰)

  • JSON 字段:image_url(下划线)

问题根源 :字段名格式不一致,框架无法自动匹配。解决方案:使用映射注解,指定两者的对应关系。

场景 2:字段命名有歧义(特殊驼峰)

问题现象:Java 字段是「首字母小写,第二个字母大写」(特殊驼峰),框架推断属性名出错,前端传同名驼峰无法映射,传全小写反而成功。

  • Java 字段:xScaleeMail(特殊驼峰)

  • 问题根源: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解决方案:使用格式化 / 转换注解,或配置全局转换器。


核心注解整理

  1. 核心框架: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;
  1. 常用框架: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;
  1. 工具类:Hutool(兼容,快速转换)

Hutool 的@Alias注解仅对 Hutool 的 JSON 工具(JSONUtil.toJsonStr()JSONUtil.toBean())生效,核心注解:

注解 作用场景 核心功能 注意点
@Alias 序列化 / 反序列化 解决字段命名不一致,实现 Java 字段与 JSON 字段的映射 1. 仅对 Hutool 工具生效,Spring MVC(Jackson)不识别;2. 多框架兼容时,需与@JsonProperty并存
  1. 基础注解: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;
}

效果:

  1. Spring MVC 接口自动转换(Jackson):正常映射image_urlxScale

  2. 手动使用 FastJSON 转换:正常映射image_urlx_scale

  3. 手动使用 Hutool 转换:正常映射image_urlx_scale


总结

  1. 数据传输的核心是「Java 对象↔JSON」的序列化 / 反序列化,Spring MVC 默认依赖 Jackson 框架。

  2. 无注解正常转换的核心是「字段命名规范 + getter/setter 存在 + JSON 字段名匹配」,普通驼峰 / 全小写字段无需额外配置。

  3. 注解是「补充手段」,仅用于解决「命名不一致 / 歧义」、「自定义转换需求」、「多框架兼容」等问题。

  4. 核心注解:Jackson@JsonProperty(映射核心)、FastJSON@JSONField、Hutool@Alias,多框架兼容需组合使用。

  5. 最佳实践:统一命名规范、优先使用 Jackson、全局配置替代单个注解,从源头减少转换问题。

相关推荐
心之伊始2 小时前
Redis 持久化机制深度解析(RDB / AOF / 混合持久化)
数据库·redis·bootstrap
爱编码的傅同学2 小时前
【常见锁的概念】死锁的产生与避免
java·开发语言
rabbit_pro2 小时前
SpringBoot3使用PostGis+GeoTools整合MybatisPlus
java·spring
Hgfdsaqwr2 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
ziqi5222 小时前
第二十五天笔记
前端·chrome·笔记
ruxshui2 小时前
Python多线程环境下连接对象的线程安全管理规范
开发语言·数据库·python·sql
OceanBase数据库官方博客2 小时前
客户案例|美的以OceanBase为基构建云中立数字化基座破局多云孤岛
数据库·oceanbase·分布式数据库
望眼欲穿的程序猿2 小时前
Ai8051U+DHT11温湿度!
java·开发语言
一只大马猴呀2 小时前
IntelliJ IDEA 中启动项目不显示端口号
java·ide·intellij-idea