Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create()
阿新 • • 發佈:2019-01-30
在Java中處理JSON格式的資料時,Google Gson是個不錯的選擇,用起來挺方便的,也有一定靈活性。我現在工作中在參與的兩個專案裡都有用它。不過它在處理Date格式時有個小陷阱,在不同環境中部署時可能會遇到問題。
Gson預設處理Date物件的序列化/反序列化是通過一個SimpleDateFormat物件來實現的,通過下面的程式碼去獲取例項:
Java程式碼
在不同的locale環境中,這樣獲取到的SimpleDateFormat的模式字串會不一樣。
例如說,在我的開發機是Windows XP SP3,zh_CN.GBK,模式字串是:
Java程式碼
而在我們的一臺測試伺服器上,RHEL 5.4,en_US.UTF-8,模式字串則是:
Java程式碼
這就使得同樣的Date物件通過Gson來序列化為JSON後內容不同。例如說要序列化的日期是2010-08-19 16:13:57,那麼在我的開發機上得到的是:
Js程式碼
而在那臺測試伺服器上則是:
Js程式碼
這就……鬱悶了。在一邊序列化的內容在另一邊會反序列化失敗。
為了避免使用Gson時遇到locale影響Date格式的問題,使用GsonBuilder來建立Gson物件,在建立過程中呼叫GsonBuilder.setDateFormat(String)指定一個固定的格式即可。例如:
Java程式碼
Gson預設處理Date物件的序列化/反序列化是通過一個SimpleDateFormat物件來實現的,通過下面的程式碼去獲取例項:
Java程式碼
- DateFormat.getDateTimeInstance()
在不同的locale環境中,這樣獲取到的SimpleDateFormat的模式字串會不一樣。
例如說,在我的開發機是Windows XP SP3,zh_CN.GBK,模式字串是:
Java程式碼
- "yyyy-M-d H:mm:ss"
而在我們的一臺測試伺服器上,RHEL 5.4,en_US.UTF-8,模式字串則是:
Java程式碼
- "MMM d, yyyy h:mm:ss a"
這就使得同樣的Date物件通過Gson來序列化為JSON後內容不同。例如說要序列化的日期是2010-08-19 16:13:57,那麼在我的開發機上得到的是:
Js程式碼
- "2010-8-19 16:13:57"
而在那臺測試伺服器上則是:
Js程式碼
- "Aug 19, 2010 4:13:57 PM"
這就……鬱悶了。在一邊序列化的內容在另一邊會反序列化失敗。
為了避免使用Gson時遇到locale影響Date格式的問題,使用GsonBuilder來建立Gson物件,在建立過程中呼叫GsonBuilder.setDateFormat(String)指定一個固定的格式即可。例如:
Java程式碼
- Gson gson = new GsonBuilder()
- .setDateFormat("yyyy-MM-dd HH:mm:ss")
- .create();