最近在排查問題的時候,日誌列印的採用物件的輸出的方式是jsonobject.tojsonstring(object)的方式,發現乙個問題,會列印出 $ref的符號。最開始懷疑是框架的問題,後來檢視了原始碼發現問題並沒這麼簡單,這是fastjson庫的乙個特性。是為了節省列印空間也為了表示物件引用關係。
static class user
// setter getter
}
測試類:
listuserlist = new arraylist<>();
user user = new user("micro", 1);
userlist.add(user);
userlist.add(user);
system.out.println(jsonobject.tojsonstring(userlist));
這裡輸出結果如下:
[,]
這裡看原始碼分析:
根據傳入的型別找到對應的objectserializer,listserializer的輸出關鍵實現如下:
會根據設定的serializerfeature來確認資料的一些特點,disablecircularreferencedetect是控制是否識別迴圈引用,預設是開啟的,所以同乙個引用會被輸出為ref的形式。
system.out.println(jsonobject.tojsonstring(userlist, serializerfeature.disablecircularreferencedetect));
這樣即可輸出:
[,]如果關閉它即可輸出的堆的內容,但是這裡就無法識別出不同的引用是否指向的同乙個物件了。
個人建議還是保持預設的值,因為最近排查的問題就是發現乙個物件陣列在遍歷的過程中去修改其引用的物件,當遍歷結束的時候發現整個陣列中所有引用的物件都變成了乙個值,理論上應該是不同的值的,後來排查debug才發現雖然每個物件都保持自己的引用,但都是引用的同乙個堆上的物件。導致最後一次修改會隱蔽的修改掉前面物件引用的物件值。這種問題十分難排查,如果輸出了陣列的日誌,看到ref標誌就知道他們之間的引用關係,迅速定位問題。
fastJson輸出json時避免 ref
場景 新手小白在開發中使用fastjson列印返回結果時出現 ref情況。場景問題描述 對現有介面新增了分頁功能,因為分頁功能返回前端的是固定模板,返回的陣列資料欄位名必須為resultlist,考慮到前端可能沒上線,後台新增get方法,兩種方式相容 tostring callsuper true ...
fastjson解析json資料
fastjson為阿里巴巴推出來的對於解析的字段首字母是大寫的,容易出問題 import j a.util.arraylist import j a.util.list import com.alibaba.fastjson.json public class json fastjson stude...
fastJson順序遍歷JSON欄位
fastjson在把json格式的字串轉換成jsonobject的時候,使用的是hashmap,所以排序規則是根據hash值排序的,如果想要按照字串順序遍歷json屬性,需要在轉換的時候指定使用linkedhashmap代替hashmap。public static void main string...