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"
	},
}
相关推荐
btyzadt12 分钟前
Ubuntu中安装Nuclei教程
linux·运维·ubuntu
养生技术人14 分钟前
Oracle OCP认证考试题目详解082系列第45题
运维·数据库·sql·oracle·开闭原则·ocp
致宏Rex28 分钟前
Docker 完整教程(3,4) | 网络与挂载
运维·docker·容器
倔强的石头1061 小时前
【Linux指南】gdb进阶技巧:断点高级玩法与变量跟踪实战
linux·运维
未来之窗软件服务1 小时前
操作系统应用开发(二十三)RustDesk ng反向代理—东方仙盟筑基期
服务器·远程桌面·仙盟创梦ide·东方仙盟·rustdek
山,离天三尺三1 小时前
基于LINUX平台使用C语言实现MQTT协议连接华为云平台(IOT)(网络编程)
linux·c语言·开发语言·网络·物联网·算法·华为云
是垚不是土2 小时前
Prometheus接入“飞书“实现自动化告警
运维·安全·自动化·github·飞书·prometheus
用户31187945592183 小时前
libopenssl-1_0_0-devel-1.0.2p RPM 包安装教程(openSUSE/SLES x86_64)
linux
天航星3 小时前
Docker 安装 Jenkins
java·运维·jenkins
未来之窗软件服务3 小时前
操作系统应用开发(二十四)RustDesk 404错误—东方仙盟筑基期
服务器·远程桌面·仙盟创梦ide·东方仙盟·rustdek