最近在使用fastjson時候遇到一個問題,后台的數據轉化為json字符串后發送到前端時候出現了$ref字樣的東西,后來明白了這是引用,下面詳細介紹下。
一、一個簡單的例子
先來上一段代碼,運行后打印的結果可能出乎意料,代碼如下:
@org.junit.Test
public void testFastJson() {
Map<String, Object> dataMap = new HashMap<>();
List<User> userList1 = new ArrayList<>();
List<User> userList2 = new ArrayList<>();
for (int i = 0; i < 2; i++) {
User user = new User();
user.setId(i);
userList1.add(user);
userList2.add(user);
}
dataMap.put("userList1", userList1);
dataMap.put("userList2", userList2);
System.out.println(JSON.toJSONString(dataMap));
}
上面代碼運行后打印結果如下:
{"userList1":[{"id":0},{"id":1}],"userList2":[{"$ref":"$.userList1[0]"},{"$ref":"$.userList1[1]"}]}
從打印結果可以看到,里面含有了$ref等字符,為什么為這樣呢,這就是引用,在傳輸的數據中出現相同的對象時,fastjson默認開啟引用檢測將相同的對象寫成引用的形式。
二、引用的分類
引用分為兩類,重復引用和循環引用
- 重復引用
指一個對象重復出現多次
- 循環引用
指你心里有我,我心里有你(互相引用),這個問題比較嚴重,如果處理不好就會出現StackOverflowError異常
三、如何關閉引用
有兩種方式可以關閉fastjson的引用支持。關閉引用檢測,還能夠提升序列化時的性能。
- 全局配置關閉
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
- 非全局關閉
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
四、引用的語法

FastJson序列化出現$ref的的解決方案介紹完成了,有問題歡迎留言溝通哦!
推薦閱讀
3.SpringBoot2.0整合集成WebSocket,實現后端數據實時推送!
如果覺得文章不錯,希望可以隨手轉發或者”在看“哦,非常感謝哈!
關注下方公眾號后回復「1024」,有驚喜哦!

