使用json-lib将Java对象转json死循环问题

对象双向引用导致死循环

主要异常信息:There is a cycle in the hierarchy!
使用json-lib将Java对象转为json过程中,因为对象之间有相互引用关系,会发生死循环问题


以下三个实体的主要关系为:
Staff : Decidedzone <=> 1 : n <=>一个员工可以负责多个定区
Decidedzone : subarea <=> 1 : n <=>一个定区可以划分多个
子区域


Staff.java

public class Staff implements java.io.Serializable {
    private String id;
    private String name;
    private String station;
    private String standard;
    private Set decidedzones = new HashSet(0);// 表示员工负责的多个定区(人为划分好的区域)
    //下面省略...
}

Decidedzone.java

public class Decidedzone implements java.io.Serializable {
    private String id;
    private Staff staff; // 负责该定区的员工
    private String name;
    private Set subareas = new HashSet(0);// 定区下划分的子区域
    //下面省略...

Subarea.java

public class Subarea implements java.io.Serializable {
    private String id;
    private Decidedzone decidedzone; // 子区域所属的分区
    private String addresskey;
    private String startnum;
    private String endnum;
    private String single;
    private String position; 
    //下面省略...


解决方法(1):
第一种情况:页面不需要展示关联数据时,将关联数据排除即可。例如,需求为员工的列表页面不需要定区的信息。StaffAction.java中的转json的部分代码

JsonConfig config = new JsonConfig();
config.setExcludes(new String[]{"decidedzones"}); 
// 指定不需要的属性和一对多或者多对一的属性,避免出现循环问题
// Staff.java 中存在decidedzones属性,Decidedzone.java中存在staff属性
String json =
JSONObject.fromObject(staffList,config).toString();
//staffList为从数据库查询出来的集合对象

解决方法(2)
第二种情况:页面需要展示关联数据时,不仅要将关联数据排除,还要设置hibernate映射文件中的懒加载属性lazy=”false”。例如,需求为定区的列表页面不仅显示定区的信息,还需要显示负责该定区的员工信息,即多的一方需要显示一方的信息。DecidedzoneAction.java中的转json部分代码如下:

JsonConfig config = new JsonConfig();
config.setExcludes(new String[]{"subareas","decidedzones"}); 
// 指定不需要的属性和一对多或者多对一的属性,避免出现循环问题
String json =
JSONObject.fromObject(decidedzoneList,config).toString();
//decidedzoneList为从数据库查询出来的集合对象

hibernate映射文件配置
这里写图片描述

总结:json-lib不好用,建议使用gson或者jackson来转json

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值