阅读 185

Jackson 之 LocalDateTime 序列化与反序列化

前言

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

全局

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

    @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 可以配置不同的时间格式模板

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

Serializer 和 DeSerializer

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

<dependency>     <groupId>com.fasterxml.jackson.datatype</groupId>     <artifactId>jackson-datatype-joda</artifactId>     <version>2.9.5</version> </dependency> 复制代码

@Data public static class Article {     @JsonSerialize(using = LocalDateSerializer.class)     @JsonDeserialize(using = LocalDateDeserializer.class)     private LocalDateTime date; } 复制代码

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

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);         }     } }


作者:菁芜
链接:https://juejin.cn/post/7025160932653268999


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐