【MY杂记】- SpringBoot 配置全局 Json 序列化与反序列化

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):gitee.com/csps/mingyu...

源码地址(前端):gitee.com/csps/mingyu...

文档地址:gitee.com/csps/mingyu...

Jackson

Jackson 是一个用于在 Java 中处理 JSON 数据的流行库。它提供了一组工具,用于将 JSON 数据解析成 Java 对象(反序列化)以及将 Java 对象序列化成 JSON 格式。Jackson 在 Java 应用程序中广泛使用,尤其在处理 JSON 数据的 Web 服务和 API 中。

以下是 Jackson 的一些关键功能和组件:

  1. ObjectMapper : ObjectMapper 类是 Jackson 的核心组件。它允许您将 JSON 数据转换为 Java 对象(反序列化)并将 Java 对象转换为 JSON 数据(序列化)。
  2. 注解 : Jackson 提供了一组注解,您可以使用这些注解来配置如何将 Java 对象序列化为 JSON 和从 JSON 反序列化。示例包括 @JsonProperty、@JsonIgnore 和 @JsonFormat。
  3. 数据绑定: Jackson 支持数据绑定,这是自动基于字段名称和类型将 JSON 数据映射到 Java 对象的过程。这使得在 Java 应用程序中处理 JSON 数据变得非常容易。
  4. 流 API: Jackson 提供了一个流式 API,允许您逐步读取和写入 JSON 数据。这对于高效处理大型 JSON 文档非常有用。
  5. 树模型: Jackson 还提供了一个树模型,将 JSON 数据表示为节点的层次结构,类似于 XML 中的 DOM。您可以使用此模型以编程方式操作 JSON 数据。
  6. 模块系统: Jackson 具有模块化的架构,这意味着您可以通过添加自定义模块和序列化程序/反序列化程序来处理特定的数据类型或格式,从而扩展其功能。

序列化与反序列化

序列化和反序列化是编程中常用的两个概念,它们通常用于将数据从一种格式转换为另一种格式,例如将对象转换为字节流或将数据转换为 JSON 格式。这两个过程在数据存储、数据传输和数据持久化等方面都很重要。

  1. 序列化 :
    • 定义:序列化是将对象或数据结构转换为可存储或传输的形式的过程,通常是将其转换为字节流或文本格式,以便稍后可以还原为原始对象或数据结构。
    • 示例 :在 Java 中,使用 Jackson 或 Java 自带的ObjectOutputStream来将 Java 对象序列化为字节流。在网络通信中,将数据转换为 JSON 或 XML 格式以便传输也是一种序列化。
  2. 反序列化 :
    • 定义:反序列化是将序列化后的数据重新转换为原始对象或数据结构的过程。这是序列化的逆操作。
    • 示例 :在 Java 中,使用 Jackson 或 Java 自带的ObjectInputStream来从字节流反序列化为 Java 对象。在网络通信中,将接收到的 JSON 或 XML 数据还原为程序可用的数据结构也是一种反序列化。

序列化和反序列化在许多编程场景中都非常有用,例如:

  • 数据持久化:将对象的状态保存到磁盘上的文件中,以便在应用程序重新启动时可以恢复数据。
  • 网络通信:在客户端和服务器之间传递数据时,将数据序列化为可传输的格式,然后在接收端进行反序列化。
  • 缓存:将对象序列化后存储在缓存中,以便快速检索,而不必每次都重新创建对象。
  • 远程过程调用 (RPC):在分布式系统中,将方法调用参数序列化为网络传输格式,然后在远程服务器上进行反序列化和方法调用。
  • 消息队列:在消息传递系统中,将消息序列化为一种格式,以便在多个应用程序之间传递消息。

配置全局序列化与反序列化

添加依赖

xml 复制代码
<!-- Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

Jackson 配置

java 复制代码
@Slf4j
@AutoConfiguration(before = JacksonAutoConfiguration.class)
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            // 全局配置序列化返回 JSON 处理
            JavaTimeModule javaTimeModule = new JavaTimeModule();
            // Jackson 序列化 Long 类型超出 JS 最大最小值序列化位字符串转为 String,解决后端返回的类型在前端精度丢失的问题
            javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);

            // Jackson 序列化 BigDecimal 类型为 String,解决后端返回的类型在前端精度丢失的问题
            javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);

            // ======================= 时间序列化规则 =======================
            // yyyy-MM-dd HH:mm:ss
            javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMATTER));
            // yyyy-MM-dd
            javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));
            // HH:mm:ss
            javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME));
            // Instant 类型序列化
            javaTimeModule.addSerializer(Instant.class, InstantSerializer.INSTANCE);


            // ======================= 时间反序列化规则 =======================
            // yyyy-MM-dd HH:mm:ss
            javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DatePattern.NORM_DATETIME_FORMATTER));
            // yyyy-MM-dd
            javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));
            // HH:mm:ss
            javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME));
            // Instant 反序列化
            javaTimeModule.addDeserializer(Instant.class, InstantDeserializer.INSTANT);

            builder.modules(javaTimeModule);
            // 时区配置
            builder.timeZone(TimeZone.getDefault());
            log.info("初始化 Jackson 配置");
        };
    }

}

AutoConfiguration.imports

arduino 复制代码
com.csp.mingyue.common.core.config.JacksonConfig

测试

添加前

json 复制代码
[
  {
        "userId": 1,
        "createTime": "2023-07-19T17:06:22",
        "updateTime": "2023-07-19T17:06:25",
   }
]

添加后

json 复制代码
[
  {
        "userId": 1,
        "createTime": "2023-07-19 17:06:22",
        "updateTime": "2023-07-19 17:06:25",
   }
]
相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
大勇前进5 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu5 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile5 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白805 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙5 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发5 天前
软件工程SOLID 五大设计原则
后端·软件工程