springboot 序列化/反序列化

springboot整合Redis-RedisTemplate设置序列化排坑之Could not read JSON: Unrecognized field "enabled" springboot在整合Redis+spring-security时RedisTemplate设置完序列化后运行碰到报错Could not read JSON: Unrecognized field “enabled”,在网上查找资料后发现是在json序列化时,不仅是根据get方法来序列化的,而是实体类中所有的有返回值的方法都会将返回的值序列化,但是反序列化时是根据set方法来实现的,所以当实体... 阅读详情

对于我们新手来说,似乎按照对应的规则配置, 就能接受返回参数, controller层上得到或返回一个对象; 其实内部有个序列化/反序列化操作,上文实体类的注解就需要我们理解一下这些逻辑了

为什么必须序列化/反序列化?

HTTP 协议传输的数据本质上是文本(字符串),它不认识 Java 对象或 JavaScript 对象。所以对象在传输前必须转换成字符串,接收方再把字符串还原成对象。

后端 Java 对象  ──[序列化]──→  JSON 字符串  ──[HTTP 传输]──→  JSON 字符串  ──[反序列化]──→  前端 JS 对象

前端 JS 对象   ──[序列化]──→  JSON 字符串  ──[HTTP 传输]──→  JSON 字符串  ──[反序列化]──→  后端 Java 对象

后端 → 前端

// 后端:Java 对象
Order order = new Order();
order.setId(1L);
order.setCreateTime(LocalDateTime.now());

// 序列化:Java 对象 → JSON 字符串
// {"id":1,"createTime":"2026-07-15 10:50:00"}
return order;  // Spring 自动通过 Jackson/FastJSON 序列化后返回
// 前端:收到 JSON 字符串,自动反序列化为 JS 对象
fetch('/order/1').then(res => res.json()).then(data => {
    console.log(data.id);        // 1
    console.log(data.createTime); // "2026-07-15 10:50:00"
});

前端 → 后端

// 前端:JS 对象
const order = {
    id: 1,
    createTime: "2026-07-15 10:50:00"
};

// 序列化:JS 对象 → JSON 字符串,通过 HTTP 发送
fetch('/order', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(order)  // 手动或框架自动序列化
});
// 后端:收到 JSON 字符串,反序列化为 Java 对象
@PostMapping("/order")
public void createOrder(@RequestBody Order order) {  // Spring 自动反序列化
    System.out.println(order.getId());        // 1
    System.out.println(order.getCreateTime()); // LocalDateTime 对象
}
传输内容是否需要序列化说明
对象/复杂数据结构✅ 必须转成 JSON 字符串传输
简单类型(String、Number)可以看作隐式序列化本质也是转成字符串
文件(二进制)✅ 但方式不同通常用 multipart/form-data,不是 JSON 序列化
URL 参数(?id=1&name=xxx)✅ 但方式不同用 URL 编码,不是 JSON 序列化

这也是为什么前面讨论的 @JsonFormat、@JSONField、@DateTimeFormat 这些注解如此重要——它们就是在控制序列化和反序列化过程中日期字段的格式。

规则

JSON 序列化框架(FastJSON、Jackson)的默认规则是:
序列化:把对象中所有非静态、非瞬态的字段(或有 getter 的属性)转成 JSON 键值对
反序列化:把 JSON 中的键值对,按字段名匹配,自动赋值给对象的对应属性(通过 setter 或直接字段访问)

@Data
public class Order {
    private Long id;
    private String name;
    private Integer relatedFundProjectCount;  // 普通属性,什么都没加
}
// 序列化:Java → JSON
Order order = new Order();
order.setId(1L);
order.setName("测试订单");
order.setRelatedFundProjectCount(5);

String json = JSON.toJSONString(order);
// 输出:{"id":1,"name":"测试订单","relatedFundProjectCount":5} ✅ 正常

// 反序列化:JSON → Java
String jsonInput = "{\"id\":2,\"name":"另一个订单","relatedFundProjectCount":10}";
Order order2 = JSON.parseObject(jsonInput, Order.class);
System.out.println(order2.getRelatedFundProjectCount()); // 10 ✅ 正常

类的转换

实体类里, 以下常见类型都不需要加任何注解,框架内置了转换器:

类型示例
基本类型及包装类Integer、Long、Boolean、Double
字符串String
集合List、Set、Map
数组String[]、Integer[]
嵌套对象User、OrderItem 等自定义类

只有框架不知道该怎么转的类型,才需要加注解或自定义转换器:

类型问题解决方案
Date / LocalDateTime格式不统一@JSONField(format = ...)
LocalDate格式不统一@JSONField(format = ...)
枚举默认输出序号或名称,可能不符合需求@JSONField 或自定义序列化器
特殊对象(如 BigDecimal 需要指定精度)默认行为不满足自定义序列化器

普通属性(Integer、String、Long 等)什么都不加,序列化和反序列化都能正常工作。
加注解(如 @JSONField)只是用来覆盖默认行为,比如改格式、改字段名、忽略字段等。不需要特殊处理时,就不用加。

Jackson(Spring Boot 默认)

为什么要写@Data
除了在代码里 使用set, get方法, 用这个注解的还有个重要作用就是 Spring Boot 默认Jackson默认的字段可见性策略是

  • 序列化:找 public 的 getter 方法 或 public 的字段
  • 反序列化:找 public 的 setter 方法 或 public 的字段

所以,不写 getter/setter 也能序列化/反序列化,只是 Jackson 默认配置下不行,需要额外配置。而 FastJSON 和 Lombok 方案天然支持。

JSON.toJSONString, JSON.parseObject

有时候 数据库存了一个json类型的字符串, 用的就是上的方法

// 序列化:Java → JSON
Order order = new Order();
order.setId(1L);
order.setName("测试订单");
order.setRelatedFundProjectCount(5);

String json = JSON.toJSONString(order);
// 输出:{"id":1,"name":"测试订单","relatedFundProjectCount":5} ✅ 正常

// 反序列化:JSON → Java
String jsonInput = "{\"id\":2,\"name":"另一个订单","relatedFundProjectCount":10}";
Order order2 = JSON.parseObject(jsonInput, Order.class);
System.out.println(order2.getRelatedFundProjectCount()); // 10 ✅ 正常
SpringBoot Jackson配置深度解析:序列化与反序列化实战指南 JSON序列化与反序列化是Web API开发的核心环节,涉及时间格式、枚举处理、null值控制、时区适配等基础但易错的技术点。其底层依赖Jackson框架的模块化设计与SpringBoot自动装配机制,配置优先级分为全局属性、ObjectMapper Bean定制和注解三级,任意一层误配都可能导致时间偏移、字段丢失或反序列化失败。掌握`JavaTimeModule`注册时机、`@JsonFormat`作用域限制、`@JsonCreator`参数绑定规则等关键原理,才能在电商、金融等高一致性要求场景中稳定输出 阅读详情

相关推荐

SpringBoot集成RabbitMQ实现JSON消息序列化

消息队列是分布式系统实现异步通信的核心组件,通过解耦生产者和消费者提升系统可靠性。RabbitMQ作为轻量级AMQP实现,与SpringBoot的深度整合使其成为微服务架构的首选消息中间件。JSON序列化作为跨语言数据交换标准,其易读性和通用性完美契合微服务通信需求。本文以电商订单系统为例,详细讲解如何配置Jackson2JsonMessageConverter实现对象到JSON的自动转换,解决类型识别和循环引用等典型问题,并通过批量处理和消息压缩等优化手段提升RabbitMQ在SpringBoot环境下的

weixin_33806859的博客 160

Jackson 2.x 系列【29】Spring Boot 集成之 Redis 序列化/反序列化

Redis是一个常用的高性能非关系型内存数据库,接下来我们学习在Spring Boot中使用Redis时,集成基于Jackson的序列化/反序列化。

记录知识、锤炼自我 4339

SpringBoot中LocalDateTime序列化问题解决方案

在Java开发中,JSON序列化是系统间数据交互的核心技术,而日期时间处理则是其中常见难点。Java 8引入的java.time API虽然解决了旧Date类的线程安全问题,但与Jackson等序列化框架的兼容性需要特殊配置。通过注册JavaTimeModule模块或自定义序列化器,开发者可以确保LocalDateTime等类型在SpringBoot项目中正确转换。这类问题在微服务架构和前后端分离场景尤为突出,涉及RestTemplate调用、Redis缓存序列化等典型应用场景。合理的日期时间处理方案能提升

weixin_33841503的博客 294

Spring Boot 与前端接口对接中的 JSON 序列化/反序列化问题全解析

JSON 序列化/反序列化问题看似琐碎,但在前后端分离项目中,是接口稳定性和数据一致性的关键。通过本文的解析,你可以系统掌握:字段映射问题日期时间序列化大数精度循环引用类型不匹配结合DTO 层 + 全局 ObjectMapper 配置 + 注解使用,基本可以避免大部分坑,让前后端接口对接更稳定、更安全。

m0_65592409的博客 1192

spring boot 中jackson自定义序列化和反序列化

spingmvc使用httpmessageconverter接口来转换http请求和响应。 如果需要添加和自定义转换器,则可以使用spring boot的HttpMessageConverters类;任何存在于上下文忠的HttpMessageConverter的ben都会被添加到转换器列表中。 如果想使用Jackson对json进行序列化和反序列化,则可能需要编写自己的JsonSerializer和JsonDeserializer类。使用spring boot的@JsonComponent注释。使用@J

蔡定努 4300

告别sgmediation!Stata中介效应分析新选择:mediation包完整操作指南

本文介绍了Stata中介效应分析从传统sgmediation命令向mediation包的范式升级。重点阐述了如何使用medeff和medsens命令进行更严谨的因果推断,并执行关键的敏感性分析,以评估结果对未观测混杂的稳健性,为学术研究提供发表级的分析工具。

redis7keeper的博客 1157

【网安基础】--Spring/Spring Boot RCE 解析与 Shiro 反序列化漏洞的关联(包括简易加密方式梳理)

算是自我反思之后疯狂搜罗知识而后复习总结梳理的一篇,包详细的!!!

相信我,我将成为你的笔记库 1271

[pytorch] MedicalNet 3D Resnet预训练模型迁移学习实战:从分割到分类的代码改造

本文详细介绍了如何利用PyTorch对MedicalNet 3D ResNet预训练模型进行迁移学习,从分割任务改造为分类任务。通过解析模型结构、调整分类头、加载预训练权重及优化训练策略,帮助开发者在医疗影像领域快速实现高效模型部署。文章还涵盖了数据预处理、增强技巧及模型轻量化等实用内容。

kmeans3miner的博客 245

Spring Boot内置Jackson库:优点解析+JSON/CSV/XML序列化反序列化实战

摘要: 本文详解SpringBoot默认JSON库Jackson的核心优势与多格式处理技巧。Jackson凭借零配置集成、高性能、多格式支持(JSON/CSV/XML)等特性成为首选。实战部分涵盖: JSON处理:基础序列化/反序列化,定制化配置(日期格式化、空值过滤); CSV操作:通过CsvMapper实现POJO与CSV互转,支持表头映射; XML转换:使用XmlMapper处理带根节点的XML数据。 文中提供完整代码示例,并总结常见问题(如日期格式、字段映射),帮助开发者高效应对数据转换场景。适用于

★【World Of Moshow 郑锴】★ 1534

通过Scrapy爬虫抓取Deep Learning领域的论文数据

然而,大部分高质量的deep learning研究论文都是通过国际顶尖学术会议(如neurips、iclr、icml等)发表的,而这些论文的获取难度较大。在本文中,我们选择抓取arXiv的数据。arXiv是一个管理科学论文的网站,其中包括了许多领域的论文,也包括了Deep Learning领域的论文。同时,arXiv网站还提供了方便的API接口,使得我们的爬虫程序可以很方便地获取论文数据。通过结合其他的数据处理技术,我们可以对这些数据进行更深入的研究和分析,从而推动Deep Learning领域的发展。

Ob2024的博客 609

Kubernetes集群资源优化实战:Volcano调度器如何帮你省下30%GPU算力

本文详细介绍了如何通过Volcano调度器的Binpack策略优化Kubernetes集群中的GPU资源利用率,解决AI模型训练中的资源碎片化问题。通过实战配置和调优指南,帮助用户提升30%的GPU算力利用率,显著降低任务等待时间和硬件成本。

weixin_30832143的博客 506

【springboot进阶】springboot集成fastjson(二)自定义序列化/反序列化

介绍fastjson2如何使用自定义序列化和反序列化,配合日常接触的场景举例代码中如何实现,如日期型转化为毫秒数、单位元转分等。

1万+

HFSS求解器背后的数学原理:从麦克斯韦方程到S参数计算

本文深入解析了Ansys HFSS求解器的数学原理,从麦克斯韦方程出发,详细介绍了模式驱动求解(Driven Solution)和本征模求解(Eigenmode)等核心算法。通过有限元方法和模式匹配技术,HFSS将电磁场问题转化为矩阵方程求解,实现S参数计算和场分布分析,为工程师提供精确的电磁仿真工具。

weixin_28314575的博客 464

SpringBoot全局配置LocalDate/LocalTime/LocalDateTime的序列化和反序列化

本文介绍了如何优雅配置SpringBoot中Jackson对Java 8日期时间类型的支持。通过Jackson2ObjectMapperBuilderCustomizer自定义配置。

jiahaodong的博客 97

项目模块提取生成jar包上传到nexus供其他项目使用

项目场景: 微服务项目当中的某一个模块其他项目进行复用,资源管理搭建的有私服 nexus。 问题描述: 如果把功能用到其他项目,代码重复量太大,不想些重复的代码。 原因分析: 如果把这个模块单独提取出来进行复用,至于操作数据库的功能,使用远程调用进行数据库操作,这样就能解决相同模块重复编写的工作。量。 解决方案: 首先对模块代码进行封装提取,把一些用到的参数提取出来,以传参的形式来对参数进行传递。这个需要根据具体的情况进行代码提取,提取之后把这个模块的代码进行打包,打包可以借助开发工具进行打包(记得使用 d

lierjun 的专栏 450

YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块

本文记录的是基于FasterNet的YOLOv11轻量化改进方法研究。FasterNet的网络结构借鉴 CNN 的设计理念,通过提出的PConv减少推理时的计算和内存成本,同时减少通道数并增加部分比例,降低延迟,并通过后续的PWConv来弥补特征信息可能缺失的问题,提高了准确性。本文在替换骨干网络中配置了原论文中的和六种模型,以满足不同的需求。

Limiiiing的博客 2029

springboot自定义序列化器/反序列化器

自定义序列化

f1766的博客 873

基于Java+SpringBoot+微信小程序实现奶茶点单系统

再不用担心逢年过节的第一杯奶茶有没有人送了,制作一个奶茶点单系统自己当店主,开怀畅饮,一劳永逸。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

Spring Boot Jackson 自定义序列化/反序列化操作

配置全局字符串去掉前后空格 使用JsonSerialize与JsonDeserialize自定义转参数,处理Date日期格式

lemon 7519

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SpringBoot日期格式化实战:LocalDateTime序列化与反序列化全攻略

日期时间处理是接口开发中最常见的痛点之一。尤其在SpringBoot项目中,LocalDateTime的序列化与反序列化机制复杂,涉及Jackson配置、时区转换、表单绑定等多个环节,稍有不慎就会导致接口返回数组或ISO字符串,引发前后端联调冲突。理解Java时间类型的底层原理,掌握全局ObjectMapper定制、@JsonFormat与@DateTimeFormat的正确使用边界,是构建健壮接口的关键。从统一的时间格式策略、时区规范化到兼容多格式的自定义反序列化器,这套方案能有效提升开发效率与系统稳定性

weixin_33391446的博客 63

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

使用HttpMessageConverter实现HTTP的序列化和反序列化

对象的序列化/反序列化大家应该都比较熟悉:序列化就是将object转化为可以传输的二进制,反序列化就是将二进制转化为程序内部的对象。序列化/反序列化主要体现在程序I/O这个过程中,包括网络I/O和磁盘I/O。 那么什么是http序列化和反序列化呢? 在使用springmvc/SpringBoot时,我们经常会这样写: @RequestMapping("/test") @ResponseBodypu...

lmb55的专栏 9866

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SpringBoot中LocalDateTime序列化报错原因与全局配置解决方案

在Java 8及以后的版本中,LocalDateTime等新日期时间API极大提升了时间处理的便利性,但许多开发者将它与SpringBoot集成时,却频繁遇到Jackson框架抛出的“Java 8 date/time type not supported by default”错误。这一问题的根源在于Jackson默认未注册JavaTimeModule,导致接口在序列化或反序列化时无法识别LocalDateTime类型,轻则返回时间数组、格式不统一,重则直接接口报错。理解其底层原理,并通过全局配置、自定义序

weixin_32705179的博客 301

jackson按照自定义注解序列化和反序列化属性

jackson按照自定义注解序列化和反序列化属性

毅香雪海的博客 3317

常用:SpringBoot集成Redis

本文介绍了在微服务架构中使用Spring集成Redis的规范写法。核心步骤包括:1)在Common服务中引入Redis依赖并配置application.yml;2)封装包含get/set等基础操作的Redis工具类;3)创建RedisConfig配置类,通过@Bean和条件注解实现自动装配;4)通过AutoConfiguration.imports文件注册配置类。其他服务只需引入Common依赖即可直接@Autowired注入使用Redis功能。单服务场景下可直接在工具类添加@Component注解简化配置

2401_87522762的博客 340

fix bug:Redis序列化算法不一致导致乱码问题的原因及自定义序列化解决方案

序列化和反序列化需要确保算法一致 SpringBoot使用RedisTemplate操作Redis进行缓存,相比于Jedis,无需考虑连接池、更方便,还可以与SpringCache无缝整合。数据(Key/Value)要保存到Redis,需要经过序列化算法来序列化成字符串。 @Autowired private RedisTemplate redisTemplate; @Autowired private StringRedisTemplate stringRedisTemplate; @PostC

FirstMrRight的博客 1227

springboot时间格式化与空值格式化

在JSR310FormattedSerializerBase类createContextual方法中会检查序列化器,首先会获取目标对象字段上的JsonFormat,如果JsonFormat 不为空,会读取其属性值。本文我们就照着此目标来实现。响应参数带Time的采用的是“ yyyy-MM-dd’T’HH:mm:ss.SSS ”格式,并且DATE默认使用的是UTC时间,比北京时间慢。没那么简单,自定义转换器中重写了时间序列化方法,并没有重写反序列化方法,而之前配置的全局序列化也已经失效。

作为一个长者,有必要记录下人生经验 1873
上一篇: mybatis-plus 实体类注解解释
下一篇: mybatis-plus mapper 常用方法
han_hanker
博客等级 码龄13年 35粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值