• 解决 LocalDateTime 的序列化与反序列化问题


    1. 问题描述

    • springboot项目中,对于LocalDateTime 的序列化,前端展示结果为带“T”的日期,如下:
      2022-08-06T18:23:30
      
      • 1
      在这里插入图片描述
    • 而且在反序列化时,接收前端传来的 "updateTime": "2022-08-09 16:41:53",这种格式的日期解析不了,要中间加个T才可以,就是这种的"2022-07-18T21:40:38",为了项目统一化,一般我们不针字段一个个处理,不管前端还是后端,所以我们需要统一处理这种格式,解决问题请继续

    2. 解决(统一处理)

    • 两种方式:

    • ① 写一个配置了即可,不多说了,直接给代码

      import com.fasterxml.jackson.databind.*;
      import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
      import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
      import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
      import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
      import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
      import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
      import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      import java.time.LocalDate;
      import java.time.LocalDateTime;
      import java.time.LocalTime;
      import java.time.format.DateTimeFormatter;
      import java.util.HashMap;
      import java.util.Map;
      
      /**
       * description 统一处理返回前端的json格式
       * @author susu
       **/
      @Configuration
      public class LocalDateConfig {
      
          private static final DateTimeFormatter FORMAT_YMD_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
          private static final DateTimeFormatter FORMAT_YMD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
          private static final DateTimeFormatter FORMAT_TIME = DateTimeFormatter.ofPattern("HH:mm:ss");
      
      
          @Bean
          public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
              Map<Class<?>, JsonSerializer<?>> serializers = new HashMap<>();
              serializers.put(LocalDateTime.class, new LocalDateTimeSerializer(FORMAT_YMD_TIME));
              serializers.put(LocalDate.class, new LocalDateSerializer(FORMAT_YMD));
              serializers.put(LocalTime.class, new LocalTimeSerializer(FORMAT_TIME));
      
              Map<Class<?>, JsonDeserializer<?>> deserializers = new HashMap<>();
              deserializers.put(LocalDateTime.class, new LocalDateTimeDeserializer(FORMAT_YMD_TIME));
              deserializers.put(LocalDate.class, new LocalDateDeserializer(FORMAT_YMD));
              deserializers.put(LocalTime.class, new LocalTimeDeserializer(FORMAT_TIME));
              return builder -> builder.serializersByType(serializers).deserializersByType(deserializers);
          }
      
      }
      
      
      • 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
    • ② 还是一个配置类 MvcConfig.java

      @Configuration
      public class MvcConfig {
          /**
           * 更改jackson默认配置
           */
          @Bean
          public ObjectMapper ObjectMapper() {
              ObjectMapper objectMapper = new ObjectMapper();
              // 日期和时间格式化
              JavaTimeModule javaTimeModule = new JavaTimeModule();
              javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
              javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
              javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
              javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
              javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
              javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
              objectMapper.registerModule(javaTimeModule);
              return objectMapper;
          }
       
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

    3. 单一处特殊处理

    • 统一处理固然是好,但是不排除有特殊的需求,不能统一处理的,所以还得考虑如果不统一处理,又要满足自己的格式需求,改怎么实现?,看下面:

    3.1 序列化

    • 不贴了,只需把上面 MvcConfig.java 序列化的代码拿出来即可

    3.2 反序列化

    • 直接看代码吧

    • ① 方式一:

      package com.liu.susu.common;
      
      import com.fasterxml.jackson.core.JsonParser;
      import com.fasterxml.jackson.core.JsonProcessingException;
      import com.fasterxml.jackson.databind.DeserializationContext;
      import com.fasterxml.jackson.databind.JsonDeserializer;
      import lombok.extern.slf4j.Slf4j;
      import org.apache.commons.lang.StringUtils;
      
      import java.io.IOException;
      import java.time.LocalDateTime;
      import java.time.format.DateTimeFormatter;
      import java.time.format.FormatStyle;
      
      @Slf4j
      public class MyLocalDateTimeDeserialize extends JsonDeserializer<LocalDateTime> {
      
          private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
      
          @Override
          public LocalDateTime deserialize(JsonParser p, DeserializationContext dc) throws IOException, JsonProcessingException {
      
              String str = p.getText();
              if (StringUtils.isNotEmpty(str)){
                  return LocalDateTime.parse(str, MyLocalDateTimeDeserialize.DATE_FORMATTER);
              }
              
              return null;
      
          }
      
      }
      
      
      • 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
    • ② 方式二:

      package com.liu.susu.common;
      
      import com.fasterxml.jackson.core.JsonParser;
      import com.fasterxml.jackson.core.JsonProcessingException;
      import com.fasterxml.jackson.databind.DeserializationContext;
      import com.fasterxml.jackson.databind.JsonDeserializer;
      import lombok.extern.slf4j.Slf4j;
      import org.apache.commons.lang.StringUtils;
      
      import java.io.IOException;
      import java.time.LocalDateTime;
      import java.time.format.DateTimeFormatter;
      
      @Slf4j
      public class MyLocalDateTimeDeserialize extends JsonDeserializer<LocalDateTime> {
          
          private static final String FORMAT_1 = "yyyy-MM-dd HH:mm:ss";
      
          @Override
          public LocalDateTime deserialize(JsonParser p, DeserializationContext dc) throws IOException, JsonProcessingException {
      
              String str = p.getText();
              if (StringUtils.isNotEmpty(str)){
                  return LocalDateTime.parse(str,DateTimeFormatter.ofPattern(FORMAT_1));
              }
      
              return null;
      
          }
      
      }
      
      
      • 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
  • 相关阅读:
    【软件测试】Fiddler 抓取 https 请求
    学生网页设计作业源码(HTML+CSS)——海贼王6页代码质量好
    对日开发 项目工程名词解析(整理中,待完善...)
    SpringSecurity 5.7.3中使用withObjectPostProcessor遇到的配置无效问题
    nginx_0.7.65_00截断_nginx解析漏洞
    下一代实时数据库:Apache Doris 【五】数据表的创建
    B032-服务器 Tomcat JavaWeb项目 Servlet
    Vue模板语法(下)
    攻防世界nice_bgm
    关于京东API数据接口业务的详细介绍
  • 原文地址:https://blog.csdn.net/suixinfeixiangfei/article/details/126322856