昨天一朋友问我一个关于JSON的问题,他是用Hibernate查询出2个实体对象(存在一对多的关系),然后放到Map集合中,最后再把Map放在List集合中。在调用JSON的
JSONArray.fromObject方法时,出现
net.sf.json.JSONException: There is a cycle in the hierarchy
异常。在网上一顿狂查之后得知 是:“由于Hibernate中好多实体类都级联关系,也就是某个类,出现了别的类的引用对象充当属性。那么这样的话用JSON来进行处理会出现嵌套的异常”
看代码吧!
请求的JS代码如下:
$(document).ready(function(){ $("#submitRe").click(function(){ $.post("loginAction.action",null,callback) }) callback=function(jsonData,textStats){ if("success"==textStats){ alert(jsonData); } } })
处理请求类的Java代码为:
package com.accp.firststruts2.actions; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONArray; import net.sf.json.JsonConfig; import net.sf.json.util.CycleDetectionStrategy; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import com.accp.firststruts2.dto.Users; import com.opensymphony.xwork2.ActionSupport; /** * * @author softceo945 * */ public class LoginAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{ private static final long serialVersionUID = -6884393637128187643L; HttpServletRequest request = null; HttpServletResponse response = null; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } public String execute() throws Exception { List<Map<String,Object>> listAll = new ArrayList<Map<String,Object>>();//最终返回的数据集合 String str ="";//JSON文本 for (int i = 0; i < 10; i++) { Users users = new Users(); users.setUsername("Users "+i); users.setPsd(Math.random()+""); users.setAge(i+15); users.setSex('男'); Map<String,Object> a = new HashMap<String, Object>(); a.put(users.getUsername(), users); listAll.add(a); } str=JSONArray.fromObject(listAll).toString(); //如果存在关联关系映射,即N-M,或M-M时,调用下面的代码来处理,时间关系,本文就没建立N-M,或M-M关系了 // JsonConfig config = new JsonConfig(); // config.setIgnoreDefaultExcludes(false); // config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); // JSONArray JsonArr=JSONArray.fromObject(listAll, config); // str=JsonArr.toString(); response.getWriter().write(str); return null; } }
重点代码为:
//如果存在关联关系映射,即N-M,或M-M时,调用下面的代码来处理,时间关系,本文就没建立N-M,或M-M关系了 // JsonConfig config = new JsonConfig(); // config.setIgnoreDefaultExcludes(false); // config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); // JSONArray JsonArr=JSONArray.fromObject(listAll, config); // str=JsonArr.toString();
设置JSON-LIB的setCycleDetectionStrategy属性让其自己处理循环,省事但是数据过于复杂的话会引起数据溢出或者效率低下。