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

最近在使用fastjson時候遇到一個問題,後臺的數據轉化爲json字符串後發送到前端時候出現了$ref字樣的東西,後來明白了這是引用,下面詳細介紹下。前端

1、一個簡單的例子

先來上一段代碼,運行後打印的結果可能出乎意料,代碼以下: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默認開啓引用檢測將相同的對象寫成引用的形式。後端

2、引用的分類

引用分爲兩類,重複引用和循環引用性能

  1. 重複引用

指一個對象重複出現屢次code

  1. 循環引用

指你內心有我,我內心有你(互相引用),這個問題比較嚴重,若是處理很差就會出現StackOverflowError異常對象

3、如何關閉引用

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

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

4、引用的語法

語法

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

推薦閱讀get

1.一分鐘帶你瞭解下java中的fork/join!

2.fastjson自定義序列化居然有這麼多姿式?

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

4.一分鐘帶你瞭解下MyBatis的動態SQL!

5.一分鐘帶你瞭解下Spring Security!


若是以爲文章不錯,但願能夠隨手轉發或者」在看「哦,很是感謝哈!

關注下方公衆號後回覆「1024」,有驚喜哦!

相關文章
相關標籤/搜索