1. 程式人生 > >fastjson使用(七) -- 迴圈引用

fastjson使用(七) -- 迴圈引用

在fastjson中,預設是開啟迴圈引用檢測的功能的。什麼叫迴圈引用呢?下面我們通過程式碼來講解一下。

V v = new V();

C c = new C();
c.v = v;

Z z = new Z();
z.v = v;

B b = new B();
b.c = c;
b.z = z;

從上面的程式碼我們可以看出,我們把V物件作為一個最基本的類,其中物件C中引用了v( c.v = v ),物件Z中也引用了V( z.v = v )。然後我們來看一下,當我們把B物件序列化後的輸出結果是什麼呢?
System.out.println(JSON.toJSONString(b));
輸出結果:
{"c":{"v":{"name":"v"}},"z":{"v":{"$ref":"$.c.v"}}}


我們可以看到輸出的結果中z中引用的V物件輸出為了 {"$ref":"$.c.v"},那麼輸出結果代表什麼意思呢?我們來看看官網給的說明:
語法 描述
{"$ref":"$"} 引用根物件
{"$ref":"@"} 引用自己
{"$ref":".."} 引用父物件
{"$ref":"../.."} 引用父物件的父物件
{"$ref":"$.members[0].reportTo"} 基於路徑的引用

通過上面我們可以知道,{"$ref":"$.c.v"}就是告訴我們引用的是C物件中的v;

有時候我們不需要迴圈引用,這個時候我們可以關閉fastjson的迴圈引用:

1.區域性關閉

JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)
2.全域性關閉
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();

並且關閉迴圈引用,會提升fastjson的效能。

相關推薦

fastjson使用() -- 迴圈引用

在fastjson中,預設是開啟迴圈引用檢測的功能的。什麼叫迴圈引用呢?下面我們通過程式碼來講解一下。 V v = new V(); C c = new C(); c.v = v; Z z = new Z(); z.v = v; B b = new B(); b.c

FastJson迴圈引用的問題

問題場景在公司程式碼中要傳一個複合物件的list集合。在複合物件中的結構是,一個物件引用了另外一個物件。這時候,在Fastjson轉化為json字串的時候出現了問題,原始碼改過了,所以這裡描述一下。有A

【Java】消除fastjson對同一物件迴圈引用的問題

傳入SerializerFeature.DisableCircularReferenceDetect引數 JSON.toJSONString([data],SerializerFeature.DisableCircularReferenceDetect);

解決fastjson迴圈引用問題(死迴圈

在雙向對映的一方向中新增“@JSONField(serialize=false)”。 @JSONField(serialize = false) public java.util.Set<CmsDocReceiveFile> getCmsDocRe

JSON工具學習記錄--FastJSON迴圈引用問題

JSON工具學習記錄–FastJSON迴圈引用問題 標籤(空格分隔): fastjson 最近基於他人專案做二次開發,遇到了迴圈引用的問題,簡單來說A引用了B,B引用了C,C引用了A,那麼轉換json就會無休止的轉換下去. 更復雜的情況,A中引用了B,

fastjson報$ref": $.data[2].indexs[0]迴圈引用錯誤

今天在做一個遞迴的時候遇到輸出的資料有$.data[2].indexs[0]的情況,在網上查詢了fastjson預設對重複的引用使用 ref方式。 DisableCircularReferenceD

使用 GC、Objgraph 幹掉 Python 記憶體洩露與迴圈引用

Python使用引用計數和垃圾回收來做記憶體管理,前面也寫過一遍文章《Python記憶體優化》,介紹了在python中,如何profile記憶體使用情況,並做出相應的優化。本文介紹兩個更致命的問題:記憶體洩露與迴圈引用。記憶體洩露是讓所有程式設計師都聞風喪膽的問題,輕則導致程式執行速度減慢,重則導致

iOS 不使用 Weak-Strong Dance,怎麼避免迴圈引用

疑惑 以下是引用: 這是來自 PopCustomAnimation.h /** @param target The object being animated. Reference the passed in target to help avoid retain loo

Spring 迴圈引用解決方案

Spring 迴圈引用解決方案 一、問題呈現:   上述memberMerchantService 和 memberService 互相引用或者深層注入引用 導致專案啟動不了 【詳細問題描述】: Bean with name ‘xxxS

Spring 迴圈引用 ——理解singleton與prototype初始化的區別

所謂的迴圈引用,就是A依賴B,B又依賴A,A與B兩個物件相互持有。像下面這種情況:   class A { B b; public A(B b) { this.b=b; } } class B { A a; public B(A a ) { this.a=a

淺談OC中的迴圈引用問題

將近一個月沒有寫文章了,藉口就不一一羅列了。。。。 廢話不多說,進入正題。 談到迴圈引用這個問題,相信很多iOS的童鞋至少都在運用block技術的時候遇到過,同樣的,很多童鞋肯定也是通過weak這個關鍵字來處理的,但是我相信,這其中肯定有不少童鞋並沒有搞明白為什麼會發生迴圈引用。本篇短文章,就以自己的理解

智慧指標的死穴 -- 迴圈引用

C++最新標準C++11中已將基於引用計數的智慧指標share_prt收入囊中,智慧指標的使用門檻越來越低,不需要使用boost庫,我們也能輕鬆享受智慧指標給我們帶來的方便。 智慧指標,正如它的名字一樣,似乎是個近乎完美的聰明角色,程式設計師不用再糾結於new出來的記憶體在哪釋放比較合適

swift裡迴圈引用問題

在參加面試的時候經常會被問得一個問題就是“你在工作中有沒有遇到迴圈引用的情況?” 首先我們先看段程式碼 var newSuccessCb: (() -> ())? override func viewDidLoad() { super.viewDidLoa

vue 解決迴圈引用元件報錯的問題

問題由來 最近在做專案的時候遇到使用迴圈元件,因為模式一樣,只有資料不一樣。按照普通元件呼叫格式來做的時候總是報錯,錯誤資訊為[Vue warn]: Unknown custom element: <selfile> - did you register

迴圈引用導致的json序列化失敗

問題 昨天在給系統加日誌後,系統就一直報 Stack Overflow錯誤,找了很久才發現問題,引入的日誌工具使用 gson序列化,而列印的日誌物件裡包含迴圈引用,導致出錯。 簡單復現 /** * C

[C++11] 迴圈引用

前言 雖然C++11中的智慧指標,一定程度上簡化了C++當中的記憶體管理;但是,shared_ptr<>的使用同時也引出了另一個問題:迴圈引用。 例子 讓我們先來看一段示例程式碼。 #include <iostream> #include

java之迴圈引用

在學習java記憶體模型及垃圾回收時提到了引用計數法無法解決迴圈引用的問題,心裡一直在思考怎麼才是迴圈引用。 netty中的迴圈引用的例子。 例如:NioServerSocketChannel類中有內部類NioServerSocketChannelConfig。每一個NioServerS

記憶體二三事: Xcode 記憶體圖、Instruments 視覺化檢測迴圈引用

小結下,記憶體管理的語義: 需要該物件的時候,他就得在。不需要他的時候,他最好被釋放了。 合理的利用資源。 需要該物件的時候,他不在,釋放早了。 野指標問題,用殭屍物件除錯 給他發訊息,程式會崩,EXC_BAD_INSTRUCTION 不需要該物件的時候,他還在。記憶體可

序列化型別為“×××的物件時檢測到迴圈引用

由於EF對映的兩個表存在一對多的關係,會自動查詢與之有對映關係的資料,將查詢的結果序列化時,由於這個物件有對映關係,那麼它在序列化A物件的時候會序列化該物件的屬性B物件,而這個屬性A物件又有屬性B物件物件,就產生了序列化物件迴圈引用 解決方法 public JsonR

Json資料的重複引用/迴圈引用($ref)

引用符號 引用 描述 "$ref":".." 上一級 "$ref":"@" 當前物件,也就是自引用 "$ref":"$" 根物件