FastJson序列化時候出現了$ref?還不趕緊學習下


最近在使用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默認開啟引用檢測將相同的對象寫成引用的形式。

二、引用的分類

引用分為兩類,重復引用和循環引用

  1. 重復引用

指一個對象重復出現多次

  1. 循環引用

指你心里有我,我心里有你(互相引用),這個問題比較嚴重,如果處理不好就會出現StackOverflowError異常

三、如何關閉引用

有兩種方式可以關閉fastjson的引用支持。關閉引用檢測,還能夠提升序列化時的性能。

  1. 全局配置關閉
  JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
  1. 非全局關閉
 JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

四、引用的語法

語法

FastJson序列化出現$ref的的解決方案介紹完成了,有問題歡迎留言溝通哦!

推薦閱讀

1.一分鍾帶你了解下java中的fork/join!

2.fastjson自定義序列化竟然有這么多姿勢?

3.SpringBoot2.0整合集成WebSocket,實現后端數據實時推送!

4.一分鍾帶你了解下MyBatis的動態SQL!

5.一分鍾帶你了解下Spring Security!


如果覺得文章不錯,希望可以隨手轉發或者”在看“哦,非常感謝哈!

關注下方公眾號后回復「1024」,有驚喜哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM