1. 程式人生 > >Jaskson精講第6篇-自定義JsonSerialize與Deserialize實現資料型別轉換

Jaskson精講第6篇-自定義JsonSerialize與Deserialize實現資料型別轉換

![](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