FastJson時間格式化問題避坑經驗分享
問題背景
某一天,我們系統(tǒng)服務的依賴方找到我們,問我們?yōu)槭裁磿r間類型的字段會有這種數(shù)據(jù)存在?導致他們解析的時候報錯。
{"sloganEndtime": "20211-03-10 11:30:00"} // 字段類型 private Date sloganEndtime;
于是我們開始進行排查,最后發(fā)現(xiàn)數(shù)據(jù)源頭來源于一個導入表格的功能,商家運營人員在導入數(shù)據(jù)的時候寫錯了,所以導致了非常離譜的問題。
問題復現(xiàn)
利用原生JDK來轉換時間 代碼截圖如下:會發(fā)現(xiàn)不會出現(xiàn)異常
我們換FastJson來嘗試下,代碼如下:發(fā)現(xiàn)會報錯!
SkuMainBean mainBean = JSON.parseObject("{\"sloganEndTime\":\"20211-03-10 11:30:00\"}", SkuMainBean.class); System.out.println(mainBean); # 異常信息 Exception in thread "main" com.alibaba.fastjson.JSONException: For input string: "20211-03-10 11:30:00" at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONPars er.java:627) at com.alibaba.fastjson.JSON.parseObject(JSON.java:361)
為什么FastJson會出問題
通過跟代碼,我們發(fā)現(xiàn)FastJson有其自己的默認時間格式:
// com.alibaba.fastjson.JSON#DEFFAULT_DATE_FORMAT public static String DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
但是其使用判斷邏輯是預先校驗了FORMAT與入參的長度:
if (strVal.length() == parser.getDateFomartPattern().length()) { DateFormat dateFormat = parser.getDateFormat(); try { return (T) dateFormat.parse(strVal); } catch (ParseException e) { // skip } } // .................................... return (T) new java.util.Date(longVal);
解決方案(3種)
1、主動增加格式化注解,尤其是需要轉換未知的入參時,需要提前確定
@JSONField(format="yyyy-MM-dd HH:mm:ss") private Date sloganEndtime;
2、利用時間戳(Long)替換Date類型
3、自己的系統(tǒng)在進行數(shù)據(jù)傳輸時,保證數(shù)據(jù)的合理性,增加相關校驗
反思
- 為什么FastJson(1.2.36版本)在使用日期格式化的時候要預先校驗長度?
PS:為什么不檢測無注解直接轉換失敗?
- 為什么其他系統(tǒng)在進行JSON轉換的時候不給字段主動添加格式化注解?
- 沒有絕對的答案,因為使用習慣和代碼慣性的原因,我們經常會忽略一些已經習以為常的東西,只有做到更加的嚴謹和周全,才能盡量減少出錯的可能性。
以上就是FastJson時間格式化問題避坑經驗分享的詳細內容,更多關于FastJson時間格式化的資料請關注腳本之家其它相關文章!
相關文章
Java String類簡單用法實戰(zhàn)示例【字符串輸出、比較】
這篇文章主要介紹了Java String類簡單用法,結合具體實例形式分析了Java使用String類實現(xiàn)字符串的輸出和比較功能相關操作技巧,需要的朋友可以參考下2019-07-07Java后臺通過Collections獲取list集合中最大數(shù),最小數(shù)代碼
這篇文章主要介紹了Java后臺通過Collections獲取list集合中最大數(shù),最小數(shù)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項目踩過的坑
IDEA旗艦版可以直接創(chuàng)建Spring MVC項目,但創(chuàng)建后的項目并不是直接就可以運行,還需要進行一些配置。這篇文章主要介紹了Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項目踩坑記 ,需要的朋友可以參考下2020-03-03