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"
	},
}
相关推荐
zl_dfq3 小时前
Linux 之 【多线程】(基于阻塞队列的生产者消费者模型、基于环形队列的生产者消费者模型)
linux
远方16093 小时前
114-Oracle Database 26ai在Oracle Linux 9上的OUI图形界面安装
linux·服务器·数据库·sql·oracle·database
开开心心_Every3 小时前
在线看报软件, 22家知名报刊免费看
linux·运维·服务器·华为od·edge·pdf·华为云
%254 小时前
Nginx
运维·nginx
skd89994 小时前
fax传真内容解密工具,传真解析工具
服务器
前端 贾公子4 小时前
组件 v-model 的封装实现原理及 Input 组件的核心实现(上)
服务器·前端·javascript
木子欢儿4 小时前
debian 13 安装配置ftp 创建用户admin可以访问 /mnt/Data/
linux·运维·服务器·数据库·debian
正儿八经的少年4 小时前
服务网关(Service Gateway)
运维·网络
wsad05325 小时前
Xshell 连接 CentOS 7 Minimal 完整配置指南
linux·运维·centos
小程同学>o<5 小时前
Linux 应用层开发入门(二十三)| 异步通知方式读取输入数据
linux·嵌入式软件·地瓜机器人·atomgit·linux应用层开发·openloong开源社区·开源新春集福