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"
	},
}
相关推荐
我星期八休息2 分钟前
Linux 进程核心原理全解:从冯诺依曼体系到进程控制全链路深度剖析
大数据·linux·服务器·开发语言·数据结构·c++·散列表
Strange_Head2 分钟前
补充知识点`makefile`、`config`、`GLP协议` 3/3 ——《驱动篇》《Linux历史发展》
linux·运维·服务器
.柒宇.3 分钟前
prometheus-入门与安装
运维·服务器·prometheus·监控
Cando学算法6 分钟前
回声服务器项目
linux·开发语言·c++·计算机网络·ubuntu
cui_ruicheng15 分钟前
Linux库制作与使用(三):ELF加载与动态链接机制
linux·运维·服务器
seabirdssss24 分钟前
闲置笔记本改造成 Ubuntu 开发测试服务器
linux·服务器·ubuntu
拾贰_C27 分钟前
【OpenAI | Ubuntu | environment | env configuration】Ubuntu 怎么/如何配置环境变量
linux·运维·ubuntu
同聘云28 分钟前
阿里云国际站服务器DNS服务器设置成什么?服务器dns怎么填写?
服务器·阿里云·云计算·云小强
小此方28 分钟前
Re:Linux系统篇(六)权限篇 · 一:用户切换与进程嵌套&&sudo提权与sudoers设置精讲
linux·运维·服务器
原来是猿30 分钟前
Linux线程同步与互斥(五):线程池的全面实现
linux·服务器·开发语言