引用com.alibaba.fastjson.JSONObject定义JSONObject对象,循环给该对象赋值时出现"$ref":"$[0]"现象

在写项目后台代码时,要根据父节点的编码得到该父节点信息,再根据父节点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 &quot; : &quot; ref&quot;:&quot; 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);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值