这里是例子:主要是想说一下FastJSON的循环引用检测问题,以及 for循环 对创建对象的引用问题
先煮个栗子:
public class loopTest {
private SubscribeReq subscribeReq;
public static void main(String[] args) {
Student student1 = new Student();
List<Student> students = new ArrayList<Student>();
for (int i = 0; i < 5; i++) {
student1.setName(i + "");
student1.setAge(i);
students.add(student1);
}
/**
* 首先是 FaetJSON 循环引用检测特性的问题
* FaetJSON 循环引用检测特性
* 不做选择时,检测到是同一个对象,会引用之前的对象,这个list是这样婶儿的:
* [{"age":4,"name":"4"},{"$ref":"$[0]"},{"$ref":"$[0]"},{"$ref":"$[0]"},{"$ref":"$[0]"}]
*/
System.out.println(JSON.toJSONString(students));
/**
* 关闭循环引用检测时,如下:
* [{"age":4,"name":"4"},{"age":4,"name":"4"},{"age":4,"name":"4"},{"age":4,"name":"4"},{"age":4,"name":"4"}]
* 但是又引出了新的问题,这个列表里的内容,不是我想要的内容
* 我本意是想在循环之外创建一个对象,每次循环时重新赋值,这样可以避免重复创建对象,但是当循环赋值完毕之后,发现
* 列表里的每一个对象的值都是最后一次赋值的内容。
* 原来是因为在这个list里,所有的对象都指向了一个对象,
* 我想要的是这样的list:
* [{"age":0,"name":"0"},{"age":1,"name":"1"},{"age":2,"name":"2"},{"age":3,"name":"3"},{"age":4,"name":"4"}]
* 最后的办法就是在循环之内创建对象,完美解决
*
*/
System.out.println(JSON.toJSONString(students, SerializerFeature.DisableCircularReferenceDetect));
//清除students内容
students.clear();
for (int i = 0; i < 5; i++) {
Student student2 =new Student();
student2.setName(i + "");
student2.setAge(i);
students.add(student2);
}
System.out.println(JSON.toJSONString(students));
}
//测试的实体类
private static class Student{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
}