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

来源:互联网 发布:shell脚本与python 编辑:程序博客网 时间:2024/06/07 12:17

对象双向引用导致死循环

主要异常信息: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

原创粉丝点击