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

自定义Jackson序列化和反序列化

为什么需要自定义Jackson序列化和反序列化?下面举个例子看看就知道了

问题描述

由于 Spring Boot 内置使用的就是 Jackson JSON 框架,所以,无需引入新的依赖,仅需添加自定义配置类即可,让其支持新的日期 API

Controller层的代码如下

@RestController
public class TestController {@PostMapping("/test2")public Response<User> test2(@RequestBody User user) {return Response.success(user);}
}

定义一个实体类User但是实体类含有LocalDateTime的日期类型

public class User {/*** 昵称*/private String nickName;/*** 创建时间*/private LocalDateTime createTime;
}

可以通过Postman这些工具来测试一下

下面是入参

{"nickName" : "小明","createTime": "2024-05-14 12:00:00"
}

你回发现一个问题就是,会报错

JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String "2024-05-14 12:00:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2024-05-14 12:00:00' could not be parsed at index 10]

提示我们 JSON 解析错误,无法将 2024-05-14 12:00:00 字符串解析为 java.time.LocalDateTime 日期类。

问题解决

需要自己定义一个配置类,覆盖框架本身的配置

@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {// 初始化一个 ObjectMapper 对象,用于自定义 Jackson 的行为ObjectMapper objectMapper = new ObjectMapper();// 忽略未知属性objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);// 设置时区objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));// JavaTimeModule 用于指定序列化和反序列化规则JavaTimeModule javaTimeModule = new JavaTimeModule();// 支持 LocalDateTime、LocalDate、LocalTimejavaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));// 支持 YearMonthjavaTimeModule.addSerializer(YearMonth.class, new YearMonthSerializer(DateTimeFormatter.ofPattern("yyyy-MM")));javaTimeModule.addDeserializer(YearMonth.class, new YearMonthDeserializer(DateTimeFormatter.ofPattern("yyyy-MM")));objectMapper.registerModule(javaTimeModule);return objectMapper;}
}

完成之后,出入参实体类中就能支持定义 LocalDateTime 日期 API 了

相关文章:

  • 家用发电机的原理是什么?
  • 【STM32】在FreeRTOS下使用硬件SPI收发数据出现的时序耦合问题(WK2124芯片为例)
  • 使用 Sass 打造动态星空背景效果
  • 远方游子的归家记:模仿美食网页的制作与实现
  • React JSX?
  • C++红黑树
  • 时间的重构:科技如何重塑人类的时间感知与存在方式
  • 【大模型系列篇】深度研究智能体技术演进:从DeepResearch到DeepResearcher,如何重构AI研究范式
  • 深度访谈:数据中台的本质不是技术堆砌,而是业务引擎的重构
  • c++进阶-继承01
  • 加固笔记本:无人机领域智能作业的可靠算力中枢
  • 交易模式革新:Eagle Trader APP上线,助力自营交易考试效率提升
  • 区块链技术在数据隐私保护中的应用:从去中心化到零知识证明
  • 【Java】面向对象程序三板斧——如何优雅设计包、封装数据与优化代码块?
  • Spring Boot 微服务中集成 MyBatis-Plus 与集成原生 MyBatis 有哪些配置上的不同?
  • java开发中的设计模式之单例模式
  • 现代c++获取linux系统架构
  • 调试chili3d笔记 typescript预习
  • Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。
  • 深入解析 sklearn 中的多种特征编码方式:功能、适用场景与选择建议
  • 外卖员投资失败负疚离家流浪,经民警劝回后泣不成声给父母下跪
  • 王日春已任教育部社会科学司司长,此前系人教社总编辑
  • 加力、攻坚、借力、问效,上海为优化营商环境推出增量举措
  • A股三大股指收涨:军工股掀涨停潮,两市成交近1.5万亿元
  • 解读|降准叠加政策利率、公积金贷款利率、结构性政策工具利率全线下调,影响有多大?
  • 马上评|颜宁“简历打假”的启示