昨天一朋友問我一個關于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屬性讓其自己處理循環,省事但是資料過于複雜的話會引起資料溢出或者效率低下。