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"
},
}