概述
Jackson作為SpringBoot中默認的JSON mapping庫,在java項目中應用十分廣泛,你在項目實踐中是不是遇到過這樣的問題:
- 日期格式看上去沒問題,但是序列化之后輸出的字符串差了8小時
- 服務接口的日期格式不統一,你可能需要各個接口分別適配,不知道如何全局配置反序列化
Jackson簡介
Jackson是一個簡單基於Java應用庫,Jackson可以輕松的將Java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成Java對象。
ObjectMapper類
ObjectMapper是Jackson庫的主要類。它提供一些功能將轉換成Java對象匹配JSON結構,反之亦然。它使用JsonParser和JsonGenerator的實例實現JSON實際的讀/寫。
數據綁定
簡單的數據綁定是指JSON映射到Java核心數據類型。下表列出了JSON類型和Java類型之間的關系。
| 序號 | JSON 類型 | Java 類型 |
|---|---|---|
| 1 | object | LinkedHashMap<String,Object> |
| 2 | array | ArrayList<Object> |
| 3 | string | String |
| 4 | complete number | Integer, Long or BigInteger |
| 5 | fractional number | Double / BigDecimal |
| 6 | true | false | Boolean |
| 7 | null | null |
Spring應用中如何使用Jackson
Spring Boot支持與三種JSON mapping庫集成:Gson、Jackson和JSON-B。Jackson是首選和默認的。
Jackson是spring-boot-starter-json依賴中的一部分,spring-boot-starter-web中包含spring-boot-starter-json。也就是說,當項目中引入spring-boot-starter-web后會自動引入spring-boot-starter-json。
解決方案一,在Model的時間字段上加上注解
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date regisDate; //注冊時間
解決方案二,application.properties配置文件增加以下配置
spring.jackson.time-zone=Asia/Shanghai
這里說明一下為什么用Asia/Shanghai 而不使用GMT+8;
GMT-8是東八區,北京時間和東八區一致。
Asia/Shanghai是已地區命名的地區標准時,在中國叫CST。這個地區標准時會兼容歷史各個時間節點。中國1986-1991年實行夏令時,夏天和冬天差1個小時,Asia/Shanghai會兼容這個時間段。
結論:1992年以后,在中國,GMT-8和Asia/Shanghai是一樣的時間,1986-1991之間,夏天會有一小時時差。
