背景
今天开发伙伴遇到一个特别坑的问题,接口返回数据返回到前端时,某些数据出现了“$ref”开头的结构数据,跟前端jquery的引用符类似。
原因
跟踪代码发现源头在于写了一个map,这个map的key不同,但是value可能会指向同一个对象。
也就是说,key1指向了对象 obj ,key2也指向了对象 obj。
这个时候,返回给前端的json数据从就出现了“$ref.”。
造成的原因是:alibaba的FastJson会默认检测对象的依赖关系,避免循环依赖,造成堆栈溢出。
解决
从网上找的解决办法有两个
方式一
关闭引用检测
JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
或者
JSONObject.toJSONString(params, SerializerFeature.DisableCircularReferenceDetect);
方式二
创建新对像,可使用 Spring自带的BeanUtils来处理或new一个对象,然后一个个set
org.springframework.beans.BeanUtils.copyProperties(source, target);
我们的解决方案:
第一步:使用方案一将对象序列化成json字符串
第二步:在使用JSONObject反序列化成对象
这样反序列化后的对象,不再是同一个对象
这个方案的优点在于,代码改动最少,仅两行代码即可。
网友评论