FastJson循环引用问题
什么是循环引用和重复引用重复引用:一个对象中的多个属性同时引用同一个对象 Object obj=new Object();
Map<String,Object> map=new HashMap<>();
map.put("1",obj);
map.put("2",obj);//引用了同一个对象
System.out.println(JSON.toJSONString(map));
循环引用:对象的属性之间存在相互引用导致循环,会引起StackOverFlow异常 Map<String,Object> map1=new HashMap<>();
Map<String,Object> map2=new HashMap<>();
map1.put("1",map2);//map1引用了map2
map2.put("1",map1);//map2又引用了map1,导致循环引用
System.out.println(JSON.toJSONString(map1));
FastJson如何解决循环引用/重复引用fastjson支持循环引用/重复引用,并且是缺省打开的。 根据fastJson的语法:
可以得出,”$.1”表示引用根对象(map)的第一个元素(obj),”..”表示引用父对象(map1). 关闭循环引用/重复引用fastjson默认对json序列化的时候进行循环引用的检测,从而避免了出现StackOverFlow异常。当序列化后的JSON传输到浏览器或者其他语言中,这些json解析器不支持循环引用,从而导致数据丢失。你可以关闭fastjson的循环引用检测。 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask(); 非全局关闭 JSON.toJSONString(obj,SerializerFeature.DisableCircularReferenceDetect); 处理StackOverFlowException关闭循环引用检测功能后,在序列化的时候会出现StackOverFlow异常,这时需要用户处理好属性之间是否有循环引用的情况出现: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |