Jackson对Java8时间类型的序列化跟反序列化的实现方法

这篇文章主要讲解了“Jackson对Java8时间类型的序列化跟反序列化的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Jackson对Java8时间类型的序列化跟反序列化的实现方法”吧!

10多年的兴山网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整兴山建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“兴山网站设计”,“兴山网站推广”以来,每个客户项目都认真落实执行。

Jackson对Java8时间类型的序列化跟反序列化

前言

默认的情况下,Jackson序列化/反序列化 Java8 新增的时间类型不会序列化成字符串或者时间戳,因为没有相对应的序列化策略,所以我们可以自己来配置对象的序列化跟反序列化策略,也可以引用jackson-datatype-jsr310的jar包来进行处理,下面我们以LocalDateTime作为示例

引入JSR310依赖

在项目内,我们引用下依赖


    com.fasterxml.jackson.datatype
    jackson-datatype-jsr310
    2.8.11

JSR310默认配置

默认的情况下,JSR310给我们提供了转换成字符串的序列化/反序列化类,分别是LocalDateTimeSerializer/LocalDateTimeDeserializer,我们可以使用已经有的实现,来进行序列化

我们往Jackson的ObjectMapper内注册一个JSR310提供的JavaTimeModule模块,JavaTimeModule内,我们需要配置LocalDateTime的的序列化策略,具体代码如下

ObjectMapper objectMapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
              .addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
              
objectMapper.registerModule(javaTimeModule);

自定义配置Java8时间类型的序列化/反序列化

这次,我们自定义转换成秒级的时间戳,Jackson提供了JsonDeserializerJsonSerializer两个抽象类,以上两个分别是反序列化跟序列化的父类,我们继承它并且实现抽象方法,具体代码如下

public class InstantSerializer extends JsonSerializer {

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeNumber(DateUtils.toSecond(value));
    }
}

public class InstantDeserializer extends JsonDeserializer {

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext txt) throws IOException, JsonProcessingException {
        return Instant.ofEpochSecond(p.getLongValue()).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }
}

将定义的序列化规格,注册到ObjectMapper里面去

ObjectMapper objectMapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new InstantSerializer())
              .addDeserializer(LocalDateTime.class,new InstantDeserializer());
              
objectMapper.registerModule(javaTimeModule);

总结

到此,我们大概介绍了两种配置的方法,一种是jsr310已经提供的,另外一种是通过继承jackson提供的抽象类,自己进行实现,两者实现上差不多,不过通过继承更灵活,更可控,使用jsr310更方便,具体的使用就仁者见仁智者见智了

感谢各位的阅读,以上就是“Jackson对Java8时间类型的序列化跟反序列化的实现方法”的内容了,经过本文的学习后,相信大家对Jackson对Java8时间类型的序列化跟反序列化的实现方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


本文名称:Jackson对Java8时间类型的序列化跟反序列化的实现方法
分享URL:http://ybzwz.com/article/giohco.html