在写项目后台代码时,要根据父节点的编码得到该父节点信息,再根据父节点id获得其下的子节点,代码如下:
public JSONObject getChild(String code) {
JSONObject obj = new JSONObject();
//父节点信息
Organization parentOrg = organizationMapper.selectByOrgCode(code);
obj.put(“value”, parentOrg.getId());
obj.put(“label”, parentOrg.getName());
//子节点信息
List orgList = organizationMapper.findAreaOrgByParentId(parentOrg.getId());
if(orgList.size() > 0) {
JSONArray childArr = new JSONArray();
JSONObject child = new JSONObject();
for(int i=0; i<orgList.size(); i++) {
Organization childOrg = orgList.get(i);
child.put(“value”, childOrg.getId());
child.put(“label”, childOrg.getName());
childArr.add(child);
}
obj.put(“children”, childArr);
}
return obj;
};
该方法应该得到这样的结果:
obj{
value: “parantId”,
label: “parantName”,
children:[
{
value: “oneChildId”,
label: “oneChildName”
},
{
value: “twoChildId”,
label: “twoChildName”
},
]
}
测试的时候没有报错,但是在有个对象中出现了"
r
e
f
"
:
"
ref":"
ref":"[0]"现象
原因:
FastJson中给相同的对象(即上例中的JSONObject child)循环赋值时,会被认为是同一个对象,即出现这种现象
解决办法:
1、既然循环赋值时,会被认为是同一个对象,那就将创建JSONObject对象放在循环体内部,这样每一次循环都是一个新的对象,不会被认为是给同一个对象赋值,如下:
//子节点信息
List orgList = organizationMapper.findAreaOrgByParentId(parentOrg.getId());
if(orgList.size() > 0) {
JSONArray childArr = new JSONArray();
//JSONObject child = new JSONObject();
for(int i=0; i<orgList.size(); i++) {
JSONObject child = new JSONObject();
Organization childOrg = orgList.get(i);
child.put(“value”, childOrg.getId());
child.put(“label”, childOrg.getName());
childArr.add(child);
}
2、FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。
关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。
用法:JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
修改代码如下:
//子节点信息 子辖区域
List orgList = organizationMapper.findAreaOrgByParentId(parentOrg.getId());
if(orgList.size() > 0) {
JSONArray childArr = new JSONArray();
JSONObject child = new JSONObject();
for(int i=0; i<orgList.size(); i++) {
Organization childOrg = orgList.get(i);
child.put(“value”, childOrg.getId());
child.put(“label”, childOrg.getName());
String str = JSON.toJSONString(child,SerializerFeature.DisableCircularReferenceDetect);//关闭引用检测
JSONObject json = JSON.parseObject(str);
childArr.add(json);
}
obj.put(“children”, childArr);
}