设计是 UserInfoBean 的 list ,其中包含两组数据 A1,A2
public static List mUserInfoList = new ArrayList<>();
UserInfoBean 的大致内容:
- public class UserInfoBean implements Serializable {
-
- public int id;
-
- // xxx data
-
- // 端口列表
- private PortInfoBean portInfoBean;
-
- public UserInfoBean() {
- }
- }
PortInfoBean 的大致内容:
- ublic class PortInfoBean {
- // 全部port
- public List
all_port_list; -
- // xxx data
- }
当我修改了A1: mUserInfoList.get(0).portInfoBean = new PortInfoBean(xxx);
然后用 fastJson 转成 jsonString ,再从 jsonString 转回 List
这时候发现,mUserInfoList.get(0).portInfoBean 和 mUserInfoList.get(1).portInfoBean ,获取到的portInfoBean对象内容是一样的。
检查jsonString时,发现是(手工还原,可能不完美准)
[{"id":0,"portInfoBean":{"all_port_list":["eth0","eth1"]}},{"id":1,"portInfoBean":{"$ref":"$[0].portInfoBean"}}]
看出来应该是 "$ref":"$[0].portInfoBean" 导致的。
第二个UserInfoBean 中的PortInfoBean 直接引用了第一个UserInfoBean 中的内容。
这个问题是由于fastjson默认开启了“循环引用检测”,若是数据中出现对象嵌套的状况,就会出现上述问题。
解决方案:
实测方案一解决。
一、直接修改代码,只须要在数据返回时,在代码强制关闭循环引用检测功能:
JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect) ;
二、修改配置文件,经过配置文件的修改不须要每一个地方都须要经过代码显示关闭该特性:
- <bean id="jsonConverter" io
-
- class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> ast
-
- <property name="supportedMediaTypes" value="application/json;charset=UTF-8"/> class
-
- <property name="features"> 配置
-
- <array value-type="com.alibaba.fastjson.serializer.SerializerFeature"> 循环
-
- <value>DisableCircularReferenceDetectvalue> 引用
-
- array>
-
- property>
-
- bean>
-
- <bean id="DisableCircularReferenceDetect"
-
- class="org.springframework.beans.factory.config.Fiel dRetrievingFactoryBean">
-
- <property name="staticField"
-
- value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect">
-
- property>
-
- bean>
参考: