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


    写在最前

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

    源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning

    源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui

    文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis

    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):在分布式系统中,将方法调用参数序列化为网络传输格式,然后在远程服务器上进行反序列化和方法调用。
    • 消息队列:在消息传递系统中,将消息序列化为一种格式,以便在多个应用程序之间传递消息。

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

    添加依赖

    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
    dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatypegroupId>
        <artifactId>jackson-datatype-jsr310artifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Jackson 配置

    @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 配置");
            };
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    AutoConfiguration.imports

    com.csp.mingyue.common.core.config.JacksonConfig
    
    • 1

    测试

    添加前

    [
      {
            "userId": 1,
            "createTime": "2023-07-19T17:06:22",
            "updateTime": "2023-07-19T17:06:25",
       }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    添加后

    [
      {
            "userId": 1,
            "createTime": "2023-07-19 17:06:22",
            "updateTime": "2023-07-19 17:06:25",
       }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    chatGPT快捷键(最新版本)
    这才是真正的Spring全家桶:Spring+SpringData+MVC+Boot+Cloud
    动态代理jdk和cglib
    CentoS7 安装篇十二:mysql主从搭建(xtrackbackup不停机搭建)
    我HTTP协议用的好好的,为什么还要用RPC协议?
    P27 含并行连结的网络 GoogLeNet / Inception V3
    利用Spring Boot实现MQTT在物联网中的应用
    TiDB 集群中能够采集的诊断数据类型
    第八章 时序检查(中)
    Go并发编程之二
  • 原文地址:https://blog.csdn.net/csp732171109/article/details/132711155