FastJSON 設定預設引數,全域性配置方式 和 一些使用方式、坑
如果要被序列化的物件含有一個date屬性或者多個date屬性按照相同的格式序列化日期的話,那我們可以使用下面的語句實現:
在應用的的Main方法體裡配置全域性引數:
JSONObject.DEFFAULT_DATE_FORMAT="yyyy-MM-dd";//設定日期格式
或者使用時傳遞配置引數
JSONObject.toJSONString(resultMap, SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteDateUseDateFormat);
但是上面的解決方案面臨一個問題,如果不滿足上面的條件(多個date屬性,而且需要按照不定的格式序列化這些日期屬性),那麼我們就需要另闢蹊徑,使用fastjson的特性來完成:
@JSONField(format="yyyyMMdd") private Date date; @JSONField(format="yyyy-MM-dd HH:mm:ss") private Date date1;
如果希望DTO轉換輸出的是下劃線風格(fastjson預設駝峰風格),請使用:
@JSONField(name="service_name")private String serviceName;
FastJSON全域性配置說明
- SerializerFeature.PrettyFormat:格式化輸出
- SerializerFeature.WriteMapNullValue:是否輸出值為null的欄位,預設為false
- SerializerFeature.DisableCircularReferenceDetect:消除迴圈引用
- SerializerFeature.WriteNullStringAsEmpty:將為null的欄位值顯示為""
- WriteNullListAsEmpty:List欄位如果為null,輸出為[],而非null
- WriteNullNumberAsZero:數值欄位如果為null,輸出為0,而非null
- WriteNullBooleanAsFalse:Boolean欄位如果為null,輸出為false,而非null
- SkipTransientField:如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。預設為true
- SortField:按欄位名稱排序後輸出。預設為false
- WriteDateUseDateFormat:全域性修改日期格式,預設為false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
- BeanToArray:將物件轉為array輸出
- QuoteFieldNames:輸出key時是否使用雙引號,預設為true
- UseSingleQuotes:輸出key時使用單引號而不是雙引號,預設為false(經測試,這裡的key是指所有的輸出結果,而非key/value的key,而是key,和value都使用單引號或雙引號輸出)
想要全域性配置的話,請在Main方法體中設定:
//先執行static程式碼塊,再執行該方法 //是否輸出值為null的欄位,預設為false JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask(); //數值欄位如果為null,輸出為0,而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullNumberAsZero.getMask(); //List欄位如果為null,輸出為[],而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullListAsEmpty.getMask(); //字元型別欄位如果為null,輸出為 "",而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullStringAsEmpty.getMask()
暫時未找到xml方式的配置方法,/(ㄒoㄒ)/~~
同時上面紅色部分在Dubbo環境下,rpc資料序列化使用fastjson會有坑。
傳遞給下游的DTO物件裡,如果類屬性是基礎資料包裝物件,比如Byte,fastson反序列化後會給該欄位設定預設值0。
但你的本意是該屬性應該是null,結果卻是0。
對於程式開發來說0是有意義的資料,最終導致出現BUG、或者資料被0覆蓋更新。
切記切記,全域性配置慎用!/(ㄒoㄒ)/~~
PS:
https://blog.csdn.net/qq_34120041/article/details/83114744
https://www.cnblogs.com/xd03122049/p/6079695.html
https://blog.csdn.net/john1337/article/details/76277617
https://blog.csdn.net/zjkyx888/article/details/78673898
https://blog.csdn.net/fly910905/article/details/78474813
- SerializerFeature.PrettyFormat:格式化輸出
- SerializerFeature.WriteMapNullValue:是否輸出值為null的欄位,預設為false
- SerializerFeature.DisableCircularReferenceDetect:消除迴圈引用
- SerializerFeature.WriteNullStringAsEmpty:將為null的欄位值顯示為""
- WriteNullListAsEmpty:List欄位如果為null,輸出為[],而非null
- WriteNullNumberAsZero:數值欄位如果為null,輸出為0,而非null
- WriteNullBooleanAsFalse:Boolean欄位如果為null,輸出為false,而非null
- SkipTransientField:如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。預設為true
- SortField:按欄位名稱排序後輸出。預設為false
- WriteDateUseDateFormat:全域性修改日期格式,預設為false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
- BeanToArray:將物件轉為array輸出
- QuoteFieldNames:輸出key時是否使用雙引號,預設為true
- UseSingleQuotes:輸出key時使用單引號而不是雙引號,預設為false(經測試,這裡的key是指所有的輸出結果,而非key/value的key,而是key,和value都使用單引號或雙引號輸出)