fastjson 解决循环引用的问题

669 阅读1分钟

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的循环引用问题。