Jackson處理Java8LocalDateTime類的序列化問題

Jackson介紹

Jackson作爲一個知名,並且經典的Java平臺的JSON庫,有人說它是最好的JSON解析工具,或者只是一個簡單的還行的JSON解析庫,不管如何Jackson都是一個值得一學,值得一用的JSON處理庫。

背景

有一個實體類,裏面有個字段

private LocalDateTime createdTime;

將該字段序列化爲Json格式時會有一大堆的字符,我想要的是指定的格式(yyyy-MM-dd HH:mm:ss)並且需要在轉換的時候加上時區(加8小時)

解決方案一

maven依賴

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.8</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
    <version>2.8.8</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>2.8.8</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.8.8</version>
</dependency>

測試代碼

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;

import java.io.IOException;
import java.time.LocalDateTime;

/**
 * 測試jackson對LocalDateTime序列化
 */
public class TestJacksonLocalDateTime {

    /**
     * 實體類
     */
    static class MyDate {
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private LocalDateTime createdTime;

        public LocalDateTime getCreatedTime() {
            return createdTime;
        }

        public void setCreatedTime(LocalDateTime createdTime) {
            this.createdTime = createdTime;
        }

        @Override
        public String toString() {
            return "MyDate{" +
                    "createdTime=" + createdTime +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        MyDate myDate = new MyDate();
        myDate.setCreatedTime(LocalDateTime.now());
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new ParameterNamesModule())
                .registerModule(new Jdk8Module())
                .registerModule(new JavaTimeModule());
        String res = mapper.writeValueAsString(myDate);
        // 打印序列化後的數據:{"createdTime":"2020-01-21 17:36:27"}
        System.out.println(res);
        MyDate myDate1 = mapper.readValue(res, MyDate.class);
        // 打印反序列化後的數據:MyDate{createdTime=2020-01-21T17:36:27}
        System.out.println(myDate1);
    }

}

解決方案二

依賴同上

在LocalDateTime類型的字段上加上註解

    /**
     * 創建時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    private LocalDateTime createdTime;
發佈了12 篇原創文章 · 獲贊 0 · 訪問量 2440
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章