1.什么是循环引用
代码:
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
Object o = new Object();
list.add(o);
list.add(o);
list.add(o);
System.out.println(list.size());
System.out.println(JSONObject.toJSONString(list));
System.out.println(JSONObject.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect));
}
打印结果:
3
[{},{"$ref":"$[0]"},{"$ref":"$[0]"}]
[{},{},{}]
由代码结果可知,fastjson在构建json数据时,如果发现添加的第二个对象跟添加的第一个对象一样,就会直接将第一个对象的引用放在第二个对象数据位置,很显然我们不想要这样的结果,那么如何解决这个问题呢?
2.如何解决fastjson的循环引用问题?
@Configuration
public class JsonHttpMessageConverterConfig {
@Bean
@Primary //表示优先加载此bean到Spring容器
public HttpMessageConverters fastJsonHttpMessageConverters(){
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//fastjson的配置类
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//对json序列化数据相关的配置
fastJsonConfig.setSerializerFeatures(
//禁止循环引用
SerializerFeature.DisableCircularReferenceDetect
);
fastConverter.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters(fastConverter);
}
}
总结:
如代码所示:通过 SerializerFeature.DisableCircularReferenceDetect 这个参数可以禁用fastjson的循环引用问题。