前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jackson 之 LocalDateTime 序列化与反序列化

Jackson 之 LocalDateTime 序列化与反序列化

作者头像
玖柒的小窝
修改2021-11-01 11:07:53
3.3K0
修改2021-11-01 11:07:53
举报
文章被收录于专栏:各类技术文章~各类技术文章~

前言

在 Java 8 中对 LocalDateTime、LocalDate 的序列化和反序列化有很多种操作

全局

ObjectMapper 对象中配置 JavaTimeModule,此为全局配置。

代码语言:javascript
复制
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        
        // other serializer and deSerializer config ...
        
        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;
    }
复制代码

DateTimeFormatter.ofPattern 可以设置不同的时间日期模板,来实现不同的效果

局部

使用 @JsonFormat 注解

pattern 可以配置不同的时间格式模板

代码语言:javascript
复制
@Data
public static class Article {
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime date;
}
复制代码

Serializer 和 DeSerializer

Jackson 提供了默认的 LocalDate 和 LocalDateTime 的 Serializer 和 DeSerializer,不过需要引入额外的 maven 依赖

代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-joda</artifactId>
    <version>2.9.5</version>
</dependency>
复制代码
代码语言:javascript
复制
@Data
public static class Article {
    @JsonSerialize(using = LocalDateSerializer.class)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    private LocalDateTime date;
}
复制代码

与此同时,还可以自定义 Serializer 和 DeSerializer,以满足某些独特场景中的时间日期格式。 比如对任意格式的时间同一反序列化为标准的 LocalDateTime 对象。

代码语言:javascript
复制
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        return this.deserialize(p.getText().trim());
    }

    private LocalDateTime deserialize(String source) {
        if (StringUtils.isBlank(source)) {
            return null;
        }  else if (source.matches("^\\d{4}-\\d{1,2}$")) {
            // yyyy-MM
            return LocalDateTime.parse(source + "-01T00:00:00.000", DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}T{1}\\d{1,2}")) {
            // yyyy-MM-ddTHH
            return LocalDateTime.parse(source + ":00:00.000", DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        }   else {
            // yyyy-MM-ddTHH:mm:ss.SSS
            return LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        }
    }

}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 全局
  • 局部
    • 使用 @JsonFormat 注解
      • Serializer 和 DeSerializer
      相关产品与服务
      文件存储
      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档