碎碎念之FastJSON的循环引用检测和for循环 对创建对象的引用问题

这里是例子:主要是想说一下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;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值