com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现"$ref":"$[0]"现象问题

1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]"现象,

/**
 * fastjson中$ref对象重复引用问题
 * 
 * 介绍:
 * FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。
 * 关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。
 * 
 * 用法:
 * JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
 */

一个集合中,给相同的对象循环赋值时,它会认为是一个对象,就出现$ref
举例:
 1 2 
 3 import com.alibaba.fastjson.JSONArray;
 4 import com.alibaba.fastjson.JSONObject;
 5 
 6 public class test {
 7 
 8     public static void main(String[] args) {
 9         JSONObject json = new JSONObject();
10         JSONArray array = new JSONArray();
11         for(int i=0;i<3;i++){
12             json.put("id",i);
13             array.add(json);
14             System.out.println(array);
15         }
16         System.out.println(array);
17     }
18 }
上面的例子就会出现这个现象。(但是如果把JSONObject json = new JSONObject();放到for循环之内就不会出现,因为每次循环都会新建一个对象,彼此不一样)

正确的做法之一为,关闭检测,更改之后,
 1  2 
 3 import com.alibaba.fastjson.JSON;
 4 import com.alibaba.fastjson.JSONArray;
 5 import com.alibaba.fastjson.JSONObject;
 6 import com.alibaba.fastjson.serializer.SerializerFeature;
 7 
 8 public class test {
 9 
10     public static void main(String[] args) {
11         JSONObject json = new JSONObject();
12         JSONArray array = new JSONArray();
13         for(int i=0;i<3;i++){
14             json.put("id",i);
15             String str = JSON.toJSONString(json, SerializerFeature.DisableCircularReferenceDetect);
16             JSONObject jsonjson = JSON.parseObject(str);
17             array.add(jsonjson);
18             System.out.println(array);
19         }
20         System.out.println(array);
21     }
22 }

这个SerializerFeature.DisableCircularReferenceDetect就是关闭引用检测,就不会出现$ref了

2.当然也可以吧JSONObject初始化放到for循环内,这样就不用关闭检测了。

操作网址:https://www.cnblogs.com/zj0208/p/6196632.html

自己的思路做个记录,如果侵权,请联系删除

原文地址:https://www.cnblogs.com/tutubaobao/p/9760524.html