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