特别说明:gson处理循环引用问题,不会影响java本身的序列化,只影响gson自身的,注意区分。
1. java对象引用成环说明:
1.1 相互引用成环:
class A{
B b;
}
class B{
A a;
}
1.2 自引用成环:
class A{
A a;
}
2. 引用成环造成的问题:
在java中,对象引用成环问题,可以被jvm自动处理,但是将java对象转成json格式时,由于转换工具不能自行切断环,会导致无限解析最终会导致栈溢出错误。
3. 解决方法:
所有解决方法,基本原理都是将“环”切断。
1)gson提供了非常简洁的处理方式,将所有要转换成json的变量都用@Expose注解标记;将出现环的地方,不做任何处理。
2)创建gson构造器:
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数据