对象的引用重复使用造成了重复引用问题,Fastjson默认开启引用检测将相同的对象写成引用的形式:
1
2
3
4
5
|
{ "$ref" : "$" } // 引用根对象 { "$ref" : "@" } // 引用自己 { "$ref" : ".." } // 引用父对象 { "$ref" : "../.." } // 引用父对象的父对象 { "$ref" : "$.members[0].reportTo" } // 基于路径的引用 |
目前来说,前端还没有一个很好的办法来解析这样的JSON格式。
除了上面的重复引用外, 还衍生出了另外一个概念:"循环引用",下面来看下两者之间的区别吧:
- 重复引用:指一个对象引用重复出现多次
- 循环引用:对象A引用对象B,对象B引用对象A(这种情况一般是个雷区,轻易不要尝试的好,很容易引发StackOverflowError)
我的代码就出现了循环引用的问题,尝试了关闭循环引用,
关闭FastJson引用检测机制(慎用,循环引用时可能导致StackOverflowError)
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)
抛出一大堆异常。
百度第二种方式:
避免循环引用(某一方的引用字段不参与序列化:@JSONField(serialize=false))
没弄明白json数据明显没了啊
最终我用了这种方式做的:
Tree tree = new Tree(genOrgList());
TreeNode treeNode = tree.getTreeNode("2");
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
// 构造方法里,也可以直接传需要序列化的属性名字 f
ilter.getExcludes().add("parent");
filter.getExcludes().add("allChildren");
String data = JSONObject.toJSONString(treeNode, filter);
System.out.println(data);