Jaskson精講第6篇-自定義JsonSerialize與Deserialize實現資料型別轉換
阿新 • • 發佈:2020-09-24
![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200924072945076-666449586.png)
Jackson是Spring Boot(SpringBoot)預設的JSON資料處理框架,但是其並不依賴於任何的Spring 庫。有的小夥伴以為Jackson只能在Spring框架內使用,其實不是的,沒有這種限制。它提供了很多的JSON資料處理方法、註解,也包括**流式API、樹模型、資料繫結**,以及複雜資料型別轉換等功能。它雖然簡單易用,但絕對不是小玩具,**更多的內容我會寫成一個系列,5-10篇文章,請您繼續關注我。**
* [《序列化與反序列化核心用法-JSON框架Jackson精解第1篇》](http://www.zimug.com/java/spring/%e5%ba%8f%e5%88%97%e5%8c%96%e4%b8%8e%e5%8f%8d%e5%ba%8f%e5%88%97%e5%8c%96%e6%a0%b8%e5%bf%83%e7%94%a8%e6%b3%95-json%e6%a1%86%e6%9e%b6jackson%e7%b2%be%e8%a7%a3%e7%ac%ac%e4%b8%80%e7%af%87/.html)
* [《特殊資料格式處理-JSON框架Jackson精解第2篇》](http://www.zimug.com/java/spring/%e7%89%b9%e6%ae%8a%e6%95%b0%e6%8d%ae%e6%a0%bc%e5%bc%8f%e5%a4%84%e7%90%86-json%e6%a1%86%e6%9e%b6jackson%e7%b2%be%e8%a7%a3%e7%ac%ac2%e7%af%87/.html)
* [《屬性序列化自定義排序與字母表排序-JSON框架Jackson精解第3篇》](http://www.zimug.com/java/spring/%e5%b1%9e%e6%80%a7%e5%ba%8f%e5%88%97%e5%8c%96%e8%87%aa%e5%ae%9a%e4%b9%89%e6%8e%92%e5%ba%8f%e4%b8%8e%e5%ad%97%e6%af%8d%e8%a1%a8%e6%8e%92%e5%ba%8f-json%e6%a1%86%e6%9e%b6jackson%e7%b2%be%e8%a7%a3/.html)
* [《@JacksonInject與@JsonAlias註解-JSON框架Jackson精解第4篇》](http://www.zimug.com/java/spring/jacksoninject%e4%b8%8ejsonalias%e6%b3%a8%e8%a7%a3-json%e6%a1%86%e6%9e%b6jackson%e7%b2%be%e8%a7%a3%e7%ac%ac4%e7%af%87/.html)
* [《@JsonCreator自定義反序列化函式-JSON框架Jackson精解第5篇》](http://www.zimug.com/java/spring/jsoncreator%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%8d%e5%ba%8f%e5%88%97%e5%8c%96%e5%87%bd%e6%95%b0-json%e6%a1%86%e6%9e%b6jackson%e7%b2%be%e8%a7%a3%e7%ac%ac5%e7%af%87/.html)
本節繼續為大家介紹在Jackson序列化中經常遇到的一些特殊的資料型別,如LocalDateTime 。該如何進行序列化和反序列化。
## 一、`LocalDateTime`反序列化異常
首先我們定義一個java POJO實體類,其中關鍵的成員變數時`birthDate`,我們沒有采用Date資料型別,而是採用了Java8 新的日期型別`LocalDateTime `,使用`LocalDateTime `的好處我就不多說了,有很多的文章解釋說明。我們把精力放回到Jackson的JSON格式序列化與反序列化內容上來。
~~~
@Data
public class PlayerStar4 {
private String name; //姓名
private LocalDateTime birthDate; //出生日期
}
~~~
下面的程式碼,我們首先定義了一個PlayerStar4類的物件player,然後
* 使用writeValueAsString方法將player物件序列化為JSON字串jsonString
* 然後使用readValue方法將JSON字串jsonString ,反序列化為PlayerStar4類的物件
~~~
@Test
void testJSON2Object() throws IOException {
ObjectMapper mapper = new ObjectMapper();
PlayerStar4 player = new PlayerStar4();
player.setName("curry");//我並不知道庫裡的生日,這裡是編造的
player.setBirthDate(LocalDateTime.of(1986,4,5,12,50));
//將player物件以JSON格式進行序列化為String物件
String jsonString = mapper.writeValueAsString(player);
System.out.println(jsonString);
//將JSON字串反序列化為java物件
PlayerStar4 curry = mapper.readValue(jsonString, PlayerStar4.class);
System.out.println(curry);
}
~~~
但是上面的程式碼報錯了,從下圖中可以看出
* 將player物件序列化為JSON字串jsonString 的過程被正常執行了,但是LocalDateTime序列化之後的結果,是圖中”黃框中的黃框“內容。
* 將JSON字串反序列化的過程報錯了,因為Jackson預設情況下,根本不認識圖中”黃框中的黃框“內容這種LocalDateTime序列化之後的JSON字串資料結構。無法把它反序列化為java物件。
![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200924072945480-2141774853.png)
怎麼辦?我們需要自定義序列化及反序列化型別轉換器,有兩種方法
* 繼承StdConverter類,自定義實現String與LocalDateTime相互轉換
* 繼承JsonSerializer和JsonDeserializer類,自定義實現String與LocalDateTime相互轉換
## 二、方法一:繼承StdConverter類
繼承StdConverter類,將LocalDateTime序列化為String資料型別
~~~
public class LocalDateTimeToStringConverter extends StdC