昨天一朋友问我一个关于JSON的问题,他是用Hibernate查询出2个实体对象(存在一对多的关系),然后放到Map集合中,最后再把Map放在List集合中。在调用JSON的
异常。在网上一顿狂查之后得知 是:“由于Hibernate中好多实体类都级联关系,也就是某个类,出现了别的类的引用对象充当属性。那么这样的话用JSON来进行处理会出现嵌套的异常”
看代码吧!
请求的JS代码如下:
处理请求类的Java代码为:
重点代码为:
设置JSON-LIB的setCycleDetectionStrategy属性让其自己处理循环,省事但是数据过于复杂的话会引起数据溢出或者效率低下。
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属性让其自己处理循环,省事但是数据过于复杂的话会引起数据溢出或者效率低下。