参考贴:
https://blog.csdn.net/z714359830/article/details/51527066
使用的阿里的fastjson,其实不限于这个工具,其他序列化json的工具也是如此的。上面帖子最后说的我贴出来,比较受用:
关闭FastJson的引用检测(不推荐)
1 | JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect); |
FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。
避免重复引用序列化时显示$ref
- 在编码时,使用新对象为集合或对象赋值,而非使用同一对象
不要在多处引用同一个对象,这可以说是一种java编码规范,需要时刻注意。 - 不要关闭FastJson的引用检测来避免显示$ref
引用检测是FastJson提供的一种避免运行时异常的优良机制,如果为了避免在重复引用时显示$ref而关闭它,会有很大可能导致循环引用时发生StackOverflowError异常。这也是FastJson默认开启引用检测的原因。
避免重复/循环引用的正确姿势(推荐)
-
重复引用
1 2 3 4 5 6 7 8
List<Object> list = new ArrayList<>(); Object obj = new Object(); list.add(obj); // 创建新的对象 Object newObj = new Object(); // 使用org.springframework.beans.BeanUtils复制属性值,我这里用的spring5.0,和帖子里的BeansUtils不同, //我这里改成了spring5的BeanUtils BeanUtils.copyProperties(obj, newObj); list.add(obj);
-
循环引用
循环引用这种逻辑本身就不合理,需要在编码时注意避免,这是逻辑错误而非编码技巧。