美文网首页
java fastJson返回前台的数据有"$ref": "$.

java fastJson返回前台的数据有"$ref": "$.

作者: zhy0324 | 来源:发表于2020-08-05 13:57 被阅读0次

问题描述

今天在用postMan测试接口时,出现了下面这样的数据


image.png

出现这个问题的原因是因为重复引用、循环引用导致的。对于什么是重复引用以及循环引用,这里有一篇博文写的很好:https://blog.csdn.net/z714359830/article/details/51527066
我就卡卡西一份说明过来,一起参考

什么是重复/循环引用

简单说,重复引用就是一个集合/对象中的多个元素/属性同时引用同一对象,循环引用就是集合/对象中的多个元素/属性存在相互引用导致循环。
举例说明

  1. 重复引用
List<Object> list = new ArrayList<>();
Object obj = new Object();
list.add(obj);
list.add(obj);
  1. 循环引用
// 循环引用的特殊情况,自引用
Map<String,Object> map = new HashMap<>();
map.put("map",map);
//
// map1引用了map2,而map2又引用map1,导致循环引用
Map<String,Object> map1 = new HashMap<>();
Map<String,Object> map2 = new HashMap<>();
map1.put("map",map2);
map2.put("map",map1);
循环引用会触发的问题

重复引用问题不是很大,但是循环引用的问题就很严重
一般来说,存在循环引用问题的集合/对象在序列化时(比如Json化),如果不加以处理,会触发StackOverflowError(栈内存溢出)异常。
分析原因:
当序列化引擎解析map1时,它发现这个对象持有一个map2的引用,转而去解析map2。解析map2时,发现他又持有map1的引用,又转回map1。如此产生StackOverflowError异常。
所以大家还是要谨慎对待的


解决方式

FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测

如果是重复引用,且确定是安全的写法,那么解决方案有两种:

  1. 局部关闭FastJson的引用检测(推荐)
    返回结果集的使用,用JSON.parseArray或者JSON.parseObject转换一下结果集
JSON.parseArray(JSON.toJSONString(objects, SerializerFeature.DisableCircularReferenceDetect), Object.class);
  1. 全局关闭FastJson的引用检测(不推荐)
    在config类配置文件中,加入
fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);

相关文章

网友评论

      本文标题:java fastJson返回前台的数据有"$ref": "$.

      本文链接:https://www.haomeiwen.com/subject/asgvrktx.html