com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现“$ref“:“$[0]“现象问题

1、问题描述

有些场景下,我们会选择用JSONObject代替Map来处理业务逻辑,但是使用JSONObject时有一个需要注意的地方:在处理JSONObject对象时,引用的com.alibaba.fastjson.JSONObject,在一个集合中,循环给这个对象赋值会出现"ref":" 0",它会认为是一个对象,就出现$ref。

2、如何解决fastjson中$ref对象重复引用问题

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

关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。

用法:JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);

3、举例说明

java 复制代码
public static void main(String[] args) {
    JSONObject metricStatus = new JSONObject();
	metricStatus.put("STATUS",4);
	metricStatus.put("UPDATED_AT",currentTime);

	JSONObject ciMetricObject = new JSONObject();
	ciMetricObject.put("metric1",metricStatus);
	ciMetricObject.put("metric2",metricStatus);
	ciMetricObject.put("metric3",metricStatus);

	log.info("=====关闭引用检测前===:{}",JSON.toJSONString(ciMetricObject));
	log.info("=====多关闭引用检测后===:{}",JSON.toJSONString(ciMetricObject, SerializerFeature.DisableCircularReferenceDetect));
	
}
  • 关闭引用检测前:
java 复制代码
{
   "metric1":{
        "STATUS":"4",
        "UPDATED_AT":"20240521080808"
    },
    "metric2":{
       "$ref":"$.metric1"
    },
	"metric3":{
		"$ref":"$.metric1"
	},
}
  • 多关闭引用检测后:
java 复制代码
{
    "metric1":{
        "STATUS":"4",
        "UPDATED_AT":"20240521080808"
    },
    "metric2":{
        "STATUS":"4",
        "UPDATED_AT":"20240521080808"
    },
	"metric3":{
		"STATUS":"4",
		"UPDATED_AT":"20240521080808"
	},
}
相关推荐
2401_868534783 小时前
数据交换方式
服务器·网络
默|笙3 小时前
【Linux网络】_udp_socket(认识)
linux·网络·udp
寻道模式4 小时前
【运维心得】完整教程:绕过Win11限制让老机焕发新生
运维·操作系统·win11
程序员梅雨4 小时前
ZooKeeper面经总结
java·大数据·linux·分布式·后端·zookeeper·中间件
zzu123zsw4 小时前
从 proxy_pass 末尾斜杠到 WebAssembly 预压缩:深挖 Nginx 生产环境四大高频踩坑点
运维·nginx·wasm·webassembly·devops·运维排错
中屹指纹浏览器svip4 小时前
打开账号环境网页报错,常见原因有哪些?
服务器·开发语言·php·中屹指纹浏览器
lingran__4 小时前
Linux进程万字详解(二)|进程状态深度剖析:调度队列、内核链表、D状态设计哲学、僵尸孤儿进程与Slab机制
linux·进程管理·内核链表·pcb·僵尸进程·孤儿进程·进程状态
2401_868534784 小时前
以太网物理层标准
服务器·网络
tg_xianheyun4 小时前
亚马逊云服务器部署网站的步骤与上线检查清单
服务器·阿里云·云计算
张洛闻Eren4 小时前
Ansible【第一课】:Ansible介绍
运维·数据库·云原生·kubernetes·github·ansible