LocalDateTime的序列化和反序列化
创始人
2024-11-12 11:05:02
0

背景

最近定位出一个LocalDateTime序列化相关的问题,简单记录一下。本文重点介绍Jackson对LocalDateTime的序列化和反序列化,并结合Spring应用场景进行介绍。

1.LocalDateTime与字符串转换

可以通过DateTimeFormatter实现LocalDateTime与字符串的相互转换,如下所示:

private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  private static String getFormattedStr(LocalDateTime localDateTime) {     return DATE_TIME_FORMATTER.format(localDateTime); }  private static LocalDateTime parseLocalDateTime(String formattedStr) {     return LocalDateTime.parse(formattedStr, DATE_TIME_FORMATTER); } 

测试用例如下:

public class Application {     private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");      public static void main(String[] args) {         String formattedStr = getFormattedStr(LocalDateTime.now());         System.out.println(formattedStr);         LocalDateTime localDateTime = parseLocalDateTime(formattedStr);         System.out.println(localDateTime);     }      private static String getFormattedStr(LocalDateTime localDateTime) {         return DATE_TIME_FORMATTER.format(localDateTime);     }      private static LocalDateTime parseLocalDateTime(String formattedStr) {         return LocalDateTime.parse(formattedStr, DATE_TIME_FORMATTER);     } } 

测试用例输出结果如下所示:

2024-07-30 21:36:20 2024-07-30T21:36:20 

2.Jackson与LocalDatetime

引入pom依赖

     com.fasterxml.jackson.datatype     jackson-datatype-jsr310     2.9.1  

jackson-datatype-jsr310在原有Jackson基础上添加了对jsr310的支持, 即提供了序列化和反序列化LocalDateTime/LocalDate/LocalTime的能力,由于使用方式和原理相同,本文以LocalDateTime为例进行介绍。
在这里插入图片描述
测试用例:

@Slf4j public class JacksonTest {     private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");      @Test     @SneakyThrows     public void testJackson() {         ObjectMapper objectMapper = getObjectMapper();         Account account = new Account();         account.setId(1).setName("name").setAddress("address").setMoney(100).setCtime(LocalDateTime.now()).setSex(Sex.FeMale);         String str = objectMapper.writeValueAsString(account);          if (LOGGER.isDebugEnabled()) {             LOGGER.debug("str is {}.", str);         }          Account accountCopy = objectMapper.readValue(str,Account.class);         if (LOGGER.isDebugEnabled()) {             LOGGER.debug("AccountCopy is {}.", accountCopy);         }     }      public ObjectMapper getObjectMapper() {         ObjectMapper objectMapper = new ObjectMapper();         JavaTimeModule javaTimeModule = new JavaTimeModule();         javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DATE_TIME_FORMATTER));         javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DATE_TIME_FORMATTER));         objectMapper.registerModule(javaTimeModule);         return objectMapper;     } } 

得到运行结果:
在这里插入图片描述
jackson-datatype-jsr310包中的JavaTimeModule类为ObjectMapper提供了序列化默认配置,这里只需要修改日期的序列化和反序列化时间格式即可。

3.Spring与LocalDatetime

Spring默认使用Jackson实现序列化和反序列的能力

SpringMVC处理客户端的HTTP请求时,会经过以下流程:
在这里插入图片描述
在进入业务处理逻辑(Controller层)前,SpringMVC框架会拦截请求🥷通过Convert将application/json格式的数据转化为Java对象;业务处理完成并响应数据时,通过Convert将java对象转换为application/json格式的字符串返回给客户端。Convert处理application/json数据与ava对象的过程中,就涉及序列化和反序列化问题。

首先,看一下案例:在Spring中可以通过注册Jackson2ObjectMapperBuilder这个Bean对象实现序列化配置;
引入pom依赖

     com.fasterxml.jackson.datatype     jackson-datatype-jsr310     2.9.1  

另外,如果是SpringBoot项目,不需要额外引入该依赖:
在这里插入图片描述

@Bean public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();     JavaTimeModule javaTimeModule = new JavaTimeModule();     javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DATE_TIME_FORMATTER));     javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DATE_TIME_FORMATTER));     builder.modules(javaTimeModule);     return builder; } 

上述Bean对象注入到IOC容器后,可以实现LocalDataTime系列(LocalDate)的序列化,这限制了整个SpringMVC使用LocalDateTime的格式,不利于扩展;可通过@JsonFormat注解针对不同的属性定制序列化和反序列化时的日期格式:

@Data @Accessors(chain = true) public class Account {     private Integer id;      private String name;      private Integer money;      private String address;      private Sex sex;      @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")     private LocalDateTime ctime; } 

相关内容

热门资讯

最新技巧!大唐麻将输赢设置,牵... 最新技巧!大唐麻将输赢设置,牵手跑得快辅助器ios,微信雀神小程序能开挂吗(详细教程);1、每一步都...
总算了解!!德扑ai智能机器人... 总算了解!!德扑ai智能机器人,博乐温州棋牌有没有挂,必备教程(有挂技巧)博乐温州棋牌有没有挂辅助器...
八分钟辅助挂!亲友起牌外 挂,... 八分钟辅助挂!亲友起牌外 挂,山东麻将果然真的有挂,存在挂教程(有挂方法);暗藏猫腻,小编详细说明亲...
6分钟技巧!心悦麻将吹牛输赢规... 6分钟技巧!心悦麻将吹牛输赢规律,大唐麻将推倒胡怎么设置(原来一直都是有挂);大唐麻将推倒胡怎么设置...
程序员教你!朋朋棋牌外挂怎么开... 程序员教你!朋朋棋牌外挂怎么开,棋乐棋牌有挂吗,雀神麻将小程序提高胜率(详细教程)在进入朋朋棋牌外挂...
今日重大通报!微扑克wpk安全... 今日重大通报!微扑克wpk安全,财神十三张的胜率机制是什么,必赢方法(有挂解说)1、财神十三张的胜率...
一分钟辅助挂!山西大唐麻将有挂... 一分钟辅助挂!山西大唐麻将有挂吗,聚游广东麻将都是真的有挂,技巧教程(有挂解密)1、山西大唐麻将有挂...
8分钟介绍!越乡游绍兴麻将有没... 8分钟介绍!越乡游绍兴麻将有没有挂,浙江游戏大厅双扣辅助工具(其实总是有挂)小薇(透视辅助)致您一封...
实测必看!!wpk大厅是机器人... 实测必看!!wpk大厅是机器人,边锋有辅助挂吗,细节方法(有挂揭秘)1.边锋有辅助挂吗 ai辅助创建...
总算清楚!蜀渝牌乐汇打牌技巧,... 总算清楚!蜀渝牌乐汇打牌技巧,微乐小程序免费黑科技,广东雀神麻将插件免费版(详细教程);1、蜀渝牌乐...