Jackson對Java8時間類型的序列化跟反序列化

Jackson對Java8時間類型的序列化跟反序列化

前言

默認的狀況下,Jackson序列化/反序列化 Java8 新增的時間類型不會序列化成字符串或者時間戳,由於沒有相對應的序列化策略,因此咱們能夠本身來配置對象的序列化跟反序列化策略,也能夠引用jackson-datatype-jsr310的jar包來進行處理,下面咱們以LocalDateTime做爲示例java

引入JSR310依賴

在項目內,咱們引用下依賴app

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.8.11</version>
</dependency>

JSR310默認配置

默認的狀況下,JSR310給咱們提供了轉換成字符串的序列化/反序列化類,分別是LocalDateTimeSerializer/LocalDateTimeDeserializer,咱們能夠使用已經有的實現,來進行序列化ide

咱們往Jackson的ObjectMapper內註冊一個JSR310提供的JavaTimeModule模塊,JavaTimeModule內,咱們須要配置LocalDateTime的的序列化策略,具體代碼以下code

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兩個抽象類,以上兩個分別是反序列化跟序列化的父類,咱們繼承它而且實現抽象方法,具體代碼以下orm

public class InstantSerializer extends JsonSerializer<LocalDateTime> {

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

public class InstantDeserializer extends JsonDeserializer<LocalDateTime> {

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

將定義的序列化規格,註冊到ObjectMapper裏面去xml

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更方便,具體的使用就仁者見仁智者見智了對象

相關文章
相關標籤/搜索