后台服务返回Json数据出现$ref的问题解决方案 FastJson序列化时候出现了$ref?

本文深入解析FastJSON在处理数据重复及循环引用时的$ref现象,演示如何通过配置禁用引用检测,提升序列化性能。

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

最近在使用fastjson时候遇到一个问题,后台的数据转化为json字符串后发送到前端时候出现了$ref字样的东西,后来明白了这是引用,下面详细介绍下。

一、一个简单的例子

先来上一段代码,运行后打印的结果可能出乎意料,代码如下:

@org.junit.Test
public void testFastJson() {
    Map<String, Object> dataMap = new HashMap<>();
    List<User> userList1 = new ArrayList<>();
    List<User> userList2 = new ArrayList<>();
for (int i = 0; i &lt; 2; i  ) {
    User user = new User();
    user.setId(i);
    userList1.add(user);
    userList2.add(user);
}
dataMap.put("userList1", userList1);
dataMap.put("userList2", userList2);

System.out.println(JSON.toJSONString(dataMap));

上面代码运行后打印结果如下:

{"userList1":[{"id":0},{"id":1}],"userList2":[{"$ref":"$.userList1[0]"},{"$ref":"$.userList1[1]"}]}

从打印结果可以看到,里面含有了$ref等字符,为什么为这样呢,这就是引用,在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用的形式。

二、引用的分类

引用分为两类,重复引用和循环引用

  1. 重复引用

指一个对象重复出现多次

  1. 循环引用

指你心里有我,我心里有你(互相引用),这个问题比较严重,如果处理不好就会出现StackOverflowError异常

三、如何关闭引用

有两种方式可以关闭fastjson的引用支持。关闭引用检测,还能够提升序列化时的性能。

  1. 全局配置关闭
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();

  1. 非全局关闭
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

四、引用的语法

语法

FastJson序列化出现$ref的的解决方案介绍完成了,有问题欢迎留言沟通哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值