JSON.toJSONString中序列化空字串遇到的坑
前言
最近在做系統Bug修復時遇到了一個問題,呼叫其他服務時傳遞的引數和自己預先的不一致,例如Map中有10條記錄,然後使用JSON.toJSONString 包裝後進行網路傳遞,但是通過除錯發現接收方只收到了5條資料。經過追溯發現原來JSON.toJSONString 這裡有坑。所以現在總結記錄一下。
FastJson簡介
首先,介紹一下fastjson。fastjson是由alibaba開源的一套json處理器。與其他json處理器(如Gson,Jackson等)和其他的Java物件序列化反序列化方式相比,有比較明顯的效能優勢。詳情可以參考fastjson提供的benchmark。
ofollow,noindex" target="_blank">https://github.com/eishay/jvm-serializers/wiki
採坑例項
上面已經說到我遇到問題的描述了,下面直接看程式碼例項:

這裡箭頭指向的位置,因為sent-1 中的value為空,所以並未打印出來。
第二個使用:JSON.toJSONString(map, SerializerFeature.WriteMapNullValue) 指定序列化方式就打印出來了。
所以大家使用的時候一定切記這裡的坑。下面再看看fastJson一些預設一下屬性:
JSON.toJSONString 原始碼:
然後看下SerializerFeature屬性:
名稱 | 含義 |
QuoteFieldNames | 輸出key時是否使用雙引號,預設為true |
UseSingleQuotes | 使用單引號而不是雙引號,預設為false |
WriteMapNullValue | 是否輸出值為null的欄位,預設為false |
WriteEnumUsingToString | Enum輸出name()或者original,預設為false |
SortField | 按欄位名稱排序後輸出。預設為false |
WriteTabAsSpecial | 把\t做轉義輸出,預設為false |
PrettyForma | 結果是否格式化,預設為false |
WriteClassName | 序列化時寫入型別資訊,預設為false。反序列化是需用到 |
...... | ...... |
看到這裡大家可以針對自己的需求選擇不同序列化格式,更多SerializerFeature 請大家自行查閱。