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"
	},
}
相关推荐
lion_zjg1 小时前
Nextcloud + Collabora CODE 离线包部署安装
运维·服务器
随便做点啥2 小时前
Agent 后台 - Token工场-集群设备配置建议
服务器·经验分享
睡不醒男孩0308232 小时前
生产环境故障销账:PostgreSQL 突发连接数暴涨与死锁,如何利用 CLup 秒级定位与解锁?
运维·数据库
志栋智能2 小时前
从固定周期到动态触发:超自动化巡检的智能调度
运维·网络·自动化
a15108416932 小时前
记一次大模型探索
java·服务器·前端
暮云星影2 小时前
全志linux开发屏幕适配(二)`HDMI`驱动适配说明
linux·arm开发·驱动开发
中云DDoS CC防护蔡蔡2 小时前
游戏杀手- ACCN
运维·服务器·经验分享·网络安全·ddos
凡人叶枫2 小时前
Effective C++ 条款38:通过复合塑模出 has-a 或 \“根据某物实现出\
linux·开发语言·c++·windows
睡不醒男孩0308233 小时前
PostgreSQL 数据库运维转型:从传统模式到 CLup 平台的 25 个核心 FAQ
运维·数据库·postgresql
charlie1145141913 小时前
嵌入式Linux驱动开发——从轮询到中断
linux·开发语言·驱动开发·嵌入式