记一次FastJson循环引用错误

我重现了一次这种问题:

     @Test
    public void t8() {
        Father father = new Father();
        father.setName("father");
        Son son1 = new Son();
        son1.setName("son1");
        Son son2 = new Son();
        son2.setName("son2");
        List list = new ArrayList();
        list.add(son1);
        list.add(son2);
        father.setSon(list);

        Map map = new HashMap();
        map.put("father",father);
        map.put("son",list);

        String s = JSON.toJSONString(map);
        System.out.println(s);
    }

此时输出为:

{"son":[{"name":"son1"},{"name":"son2"}],"father":{"name":"father","son":[{"$ref":"$.son[0]"},{"$ref":"$.son[1]"}]}}

{"$ref":"$.son[0]"},{"$ref":"$.son[1]"}此时json已经给我们提示了,就是我们重复使用了上面对象中包含的对象引用;

 

其实正常逻辑不会出这个问题,我们既然要给前端数据,那么father已经包含son数组了,那么就不会在重复的在返回的map对象中重新添加son数组;但是这次出的问题是我使用的其他类的方法,又需要对数据进行处理,那么解决方法就是以下:

String s = JSON.toJSONString(map,SerializerFeature.DisableCircularReferenceDetect);

得到的结果为:

{"son":[{"name":"son1"},{"name":"son2"}],"father":{"name":"father","son":[{"name":"son1"},{"name":"son2"}]}}

 

_____________________________________________________________________

开始想的解决办法是,我在new一个list集合出来,然后重新addAll行不行.同样会显示错误,因为addAll的数据,还是以前的引用,并没有变.

除非我们改变原有对象的引用地址,这么做:(或者使用beanUtils)

      List list2 = new ArrayList();
        list.forEach(s->{
            Son ss = new Son();
            ss.setName(s.getName());
            list2.add(ss);
        });
        map.put("son",list2);

不过未免太啰嗦了..所以直接用fastjson给的解决方案配置就行了..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值