版权声明:转载请注明作者 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给的解决方案配置就行了..