特別說明:gson處理循環引用問題,不會影響java自己的序列化,隻影響gson自身的,注意區分。java
1. java對象引用成環說明:json
1.1 相互引用成環:jvm
class A{ B b; } class B{ A a; }
1.2 自引用成環:工具
class A{ A a; }
2. 引用成環形成的問題:ui
在java中,對象引用成環問題,能夠被jvm自動處理,可是將java對象轉成json格式時,因爲轉換工具不能自行切斷環,會致使無限解析最終會致使棧溢出錯誤。spa
3. 解決方法:code
全部解決方法,基本原理都是將「環」切斷。對象
1)gson提供了很是簡潔的處理方式,將全部要轉換成json的變量都用@Expose註解標記;將出現環的地方,不作任何處理。it
2)建立gson構造器:io
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() .create();// 獲取Gson構造器,能夠過濾掉不帶註解的字段
3)轉換json:
gson.toJson(testOject);
使用上面第一個相互引用成環的例子舉例說明:
3.1 阻斷環路:
class A{ @Expose B b; } class B{ A a;//不轉換該字段,阻斷循環引用 }
3.2 建立gson構造器,並轉換json:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() .create();// 獲取Gson構造器,能夠過濾掉不帶註解的字段 A testObj = new A(); String json = gson.toJson(testObj);//獲取json數據