JSON处理Hibernate实体类net.sf.json.JSONException: There is a cycle in the hierarchy异常
- 博客分类:
- 日常报错解决方案
json.netHibernateDAO
由于Hibernate中好多实体类都级联关系,也就是某个类,出现了别的类的引用对象充当属性。那么这样的话用JSON来进行处理会出现嵌套的异常:net.sf.json.JSONException: There is a cycle in the hierarchy异常。
在处理这个错误之前先看看普通的JSON处理数据示例
- <span style="font-size: medium;">TProcessInfoDAO dao = new TProcessInfoDAO();
- List<TProcessInfo> orgData = dao.findAll();
- JSONArray array=JSONArray.fromObject(orgData);
- String json=array.toString();
- System.out.println(json);
- </span>
这样的处理方式中要求TProcessInfoDAO类所有属性必须是普通属性,不包含引用按对象
如果包含引用对象一般需要做一下配置过滤引用属性,这样JSON处理就能通过:这种是不会输出引用对象的
- <span style="font-size: medium;">TProcessInfoDAO dao = new TProcessInfoDAO();
- List<TProcessInfo> orgData = dao.findAll();
- JsonConfig config = new JsonConfig();
- config.setJsonPropertyFilter(new PropertyFilter() {
- public boolean apply(Object source, String name, Object value) {
- //配置你可能出现递归的属性
- if (name.equals("TProcessInfos") || name.equals("TProcessInfo")) {
- return true;
- } else {
- return false;
- }
- }
- });
- //调用ExtHelper将你的JSONConfig传递过去
- JSONArray JsonArr=JSONArray.fromObject(orgData, config);
- String jsonstr=JsonArr.toString();
- </span>
还有一种处理方式,这种会输出引用对象
设置JSON-LIB的setCycleDetectionStrategy属性让其自己处理循环,省事但是数据过于复杂的话会引起数据溢出或者效率低下。
- <span style="font-size: medium;">TProcessInfoDAO dao = new TProcessInfoDAO();
- List<TProcessInfo> orgData = dao.findAll();
- JsonConfig config = new JsonConfig();
- config.setIgnoreDefaultExcludes(false);
- config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
- //调用ExtHelper将你的JSONConfig传递过去
- JSONArray JsonArr=JSONArray.fromObject(orgData, config);
- String jsonstr=JsonArr.toString();
- System.out.println(jsonstr);</span>