基于 Fastjson 重复引用和循环引用所导致的生产问题 - 出现$ref引用,分析原因,提出解决办法(很透彻)

本文详细介绍了Fastjson在处理【循环引用】和【重复引用】时的问题及其解决办法。通过实例展示了如何关闭引用检测,防止出现JSON解析错误,并探讨了在循环引用场景下关闭引用检测可能导致的`StackOverflowError`。强调了解决这类问题的根本方法是优化数据结构设计,而非简单关闭引用检测。同时,提出了编码规范和最佳实践建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。

前言

通过本篇,你将学习到 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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java Punk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值