记一次FastJson循环引用错误

版权声明:转载请注明作者 https://blog.csdn.net/myth_g/article/details/85051500

我重现了一次这种问题:

     @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给的解决方案配置就行了..

扫描二维码关注公众号,回复: 5291489 查看本文章

猜你喜欢

转载自blog.csdn.net/myth_g/article/details/85051500
今日推荐