原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。
前言
通过本篇,你将学习到 alibaba.fastjson【循环引用】和【重复引用】的概念,还有出现此类问题时候的【解决办法】,着急的朋友可以直接看最后的总结。
拜同事所赐,又给我搞出来个奇怪的问题,又是在大半夜,又是上线的前一刻发现的,又双叒叕......有机会一定要好好谢谢你。
问题的定位并不难,由于前端接收的Data中出现了$ref字样的数据,导致了处理和显示的时候产生错误,从后端Debug一下就会发现是Fastjson.toJSONString()出现的问题。
后来明白了,fastjson默认开启引用检测,在传输的数据中出现相同的对象时,会将相同的对象写成引用的形式,$ref 就是引用的语法。
虽然在第一次看到的时候确实有点懵逼——“这TM是个啥啥个啥啥啊”,但现在想想生产的问题也没什么可炫耀的,所以我就不巴巴了,说多了显得更Low,o(╯□╰)o。
正文
Fastjson 使用Java语言编写,是阿里巴巴开源的项目,号称最快的JSON库,作为前后端或系统间的数据传输格式再合适不过。
Fastjson 还有个特性,支持引用检测功能,引用分为两种——【重复引用】和【循环引用】,并且是“缺省打开”的。
- 重复引用:一个对象对另外一个对象多个字段重复引用,或集合字段重复引用;
- 循环引用:对象A引用对象B,对象B引用对象A,出现你中有,我中有你现象;
当序列化后的JSON传输到浏览器或者其他语言中,如果这些Json解析器不支持循环引用,从而导致数据丢失,那我们可以关闭fastjson的循环引用支持,并且,关闭引用检测,还能够提升序列化时的性能。
1. 关闭方法
- 全局配置关闭
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
- 非全局关闭
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
2. 语法
如果关闭引用检测&#x