最近在使用fastjson時候遇到一個問題,後臺的數據轉化爲json字符串後發送到前端時候出現了$ref字樣的東西,後來明白了這是引用,下面詳細介紹下。前端
先來上一段代碼,運行後打印的結果可能出乎意料,代碼以下:java
@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)); }
上面代碼運行後打印結果以下:json
{"userList1":[{"id":0},{"id":1}],"userList2":[{"$ref":"$.userList1[0]"},{"$ref":"$.userList1[1]"}]}
從打印結果能夠看到,裏面含有了$ref等字符,爲何爲這樣呢,這就是引用,在傳輸的數據中出現相同的對象時,fastjson默認開啓引用檢測將相同的對象寫成引用的形式。後端
引用分爲兩類,重複引用和循環引用性能
指一個對象重複出現屢次code
指你內心有我,我內心有你(互相引用),這個問題比較嚴重,若是處理很差就會出現StackOverflowError異常對象
有兩種方式能夠關閉fastjson的引用支持。關閉引用檢測,還可以提高序列化時的性能。blog
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
FastJson序列化出現$ref的的解決方案介紹完成了,有問題歡迎留言溝通哦!字符串
推薦閱讀get
3.SpringBoot2.0整合集成WebSocket,實現後端數據實時推送!
若是以爲文章不錯,但願能夠隨手轉發或者」在看「哦,很是感謝哈!
關注下方公衆號後回覆「1024」,有驚喜哦!