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、举例说明
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));}
- 关闭引用检测前:
{"metric1":{"STATUS":"4","UPDATED_AT":"20240521080808"},"metric2":{"$ref":"$.metric1"},"metric3":{"$ref":"$.metric1"},
}
- 多关闭引用检测后:
{"metric1":{"STATUS":"4","UPDATED_AT":"20240521080808"},"metric2":{"STATUS":"4","UPDATED_AT":"20240521080808"},"metric3":{"STATUS":"4","UPDATED_AT":"20240521080808"},
}