為Gson設置日期數據的轉換格式
背景
最近准備把一個APP對應的SDK工具的HTTP請求實現方式由Jersey換成HttpClient(現在已經叫做Http Component Client),需要發HTTP Request的時候把對象轉換為json,接受HTTP Response的時候再把json轉為對象。
選型
我們知道JAVA世界里面主流的JSON轉換工具有Jackson,Gson,當然還有我們阿里的fastjson。
其中Jackson算是用的最古老也是應用相當廣泛的一種,並且跟SpringBoot高度集成,可以通過SpringBoot的配置文件(profile)直接設置一些屬性,非常的方便。
而由於SDK是提供給調用某個APP的工具JAR包,本身不具備獨立運行的能力,所以沒有導入SpringBoot。
因此考慮使用Gson,順便學習一下。
問題與解決
一般來寫代碼來實現我們的需求的過程中都不是一帆風順,果然這次也不例外。
不過不慌,遇到問題說明學習進步的時候到了,讓我們看看這次都碰到了哪些問題。
1. 日期類型轉換精度丟失
public static void main(String[] args){
java.sql.Timestamp time = new Timestamp(System.currentTimeMillis());
Gson gson = new GsonBuilder().create();
System.out.println(time.equals(gson.fromJson(gson.toJson(time),
java.sql.Timestamp.class)));
}
我們考慮上面的代碼輸出什么,希望是輸出true,結果是false。
那么是怎么一回事,調試后一看,原來gson轉化的日期數據丟失了毫秒。
抱着嚴謹的態度調查了一下,原來Gson默認使用yyyy-MM-dd HH:mm:ss的format來進行解析,那我們可以改變這個format嗎,答案是可以的。
public static void main(String[] args){
java.sql.Timestamp time = new Timestamp(System.currentTimeMillis());
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss.SSS").create();
System.out.println(time.equals(gson.fromJson(gson.toJson(time),
java.sql.Timestamp.class)));
}
使用“.SSS”表示三位毫秒。
