在实现会议自动邮件通知时,遇到了一些问题,如hibernate延迟加载错误,这都是老掉牙的问题了,一看就知道加个lazy=flase就OK了。想不到快要完成了又遇到了新的问题,JSON死循环,实在让人郁闷。异常如下:
net.sf.json.JSONException: There is a cycle in the hierarchy!
at net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.
handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)
at net.sf.json.JSONObject._fromBean(JSONObject.java:674)
at net.sf.json.JSONObject.fromObject(JSONObject.java:181)
at net.sf.json.JSONArray._processValue(JSONArray.java:2381)
at net.sf.json.JSONArray.processValue(JSONArray.java:2412)
Truncated. see log file for complete stacktrace
>
仔细查了一下发现是hibernate主外键关联的错,后来就想下json源代码下来看,发现大费周章都没搞到json源码,还是老办法反编译瞅瞅,发现JSONArray根据判断取得的不同类型调用相应的方法,
if (object instanceof Collection)
return _fromCollection((Collection)object, jsonConfig);
而我从hibernate那得到的是list,所以去调用了_fromCollection方法,而里面的方法发现一个问题:该方法会不断的拆开实体属性,直到没有为止,而我的ContactGroup里有两个属性用于自身关联
private Set contactGroups = new HashSet(0);
private Set contactGroupPersons = new HashSet(0);
也就是说主外键自身关联的是个死循环,那怎么才能不让他出现这种情况呢,应该有个配置的参数后者终止循环的地方吧,查看发现,jsonConfig,呵呵,config应该是配置参数吧,参看JsonConfig看见巨多的属性,有点晕PropertyFilter ,不提了,看了老半天,发现了一个属性PropertyFilter,PropertyFilter 是一个interface,代码如下:
public interface PropertyFilter
{
public abstract boolean apply(Object obj, String s, Object obj1);
}
也就是说我可以通过这个方法过滤掉List里的相应属性,只要让它返回true就可过滤掉,……,有点悬……我们重写一下这个方法:
JsonConfig cfg = new JsonConfig();
cfg.setJsonPropertyFilter(new PropertyFilter()
{
public boolean apply(Object source, String name, Object value) {
if(name.equals("contactGroups")||name.equals("contactGroupPersons")) {
return true;
} else {
return false;
}
}
});
将hibernate产生的实体bean中的contactGroups和contactGroupPersons过滤掉就OK了!
然后调用JSONArray jsonArr = JSONArray.fromObject(mychildren,cfg); mychildren是hibernate返回的list。
PrintWriter out = response.getWriter();
JSONObject json=null;
json = new JSONObject();
System.out.println(jsonArr);
out.print(jsonArr);
json.put("jsonArr", jsonArr);
备注 -- > 前端接收json:
function changeItem(spid) {
var htmlStr = "";
var param = {
service_code : spid
}
var http_value = jQuery.param(param);
var url = "${pageContext.request.contextPath}/spServerAction/getContentBySpID.do?spid="+spid;
$.getJSON(url, http_value, function(data){
document.getElementById("contentid").options.length = 0;
var htmlStr="<option value='0'>请选择分类类型</option>";
for (i = 0; i < data.length; i++) {
htmlStr += "<option value='" + data[i].serialnumber + "'>" + data[i].name + "</option>";
}
$("#contentid").append(htmlStr);
});
}
<form> <select name="spid" onchange="changeItem(this.value)"> </form>
分享到:
相关推荐
如果需要解析的数据间存在级联关系,而互相嵌套引用,在hibernate中极容易嵌套而抛出net.sf.json.JSONException: There is a cycle in the hierarchy异常。
6. **错误处理**:在处理JSON时,需要捕获JSONException,这是一个在解析、序列化或验证JSON时可能会抛出的异常。 7. **与其他数据类型转换**:JSONObject支持与Java基本类型、集合、Map等之间的转换,提供便利的...
在Java开发中,数据交换和存储常常涉及到JSON(JavaScript Object Notation)格式,因为它轻量级、易读写且被广泛支持。`net.sf.json.JSONObject`是开源库Apache Commons的一个组件,提供了Java对象与JSON对象之间的...
在编程过程中,我们可能会遇到各种异常,其中"JSONException: expect ‘:’ at 0, actual =" 是一个典型的Fastjson库在解析JSON时抛出的异常。Fastjson是阿里巴巴提供的一款高性能的JSON解析和生成库,它广泛应用于...
7. **错误处理**:当解析JSON字符串或生成JSON对象时,如果遇到问题,`net.sf.json`会抛出异常,如`JSONException`,帮助开发者定位并解决问题。 总之,`net.sf.json`是一个强大的Java JSON处理库,它提供了一整套...
并且对Dao和Service进行了封装,内含.jar包,并且解决了一对多双向关联的could not initialize proxy - no Session错误,同时解决了……invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!...
5. **JSONException**: 当在处理JSON过程中遇到错误时,`JSONException`会被抛出。比如,当尝试访问不存在的键,或者JSON格式不正确时,都会抛出这个异常。 除了这些基本的类,`org.json.jar`还提供了其他一些实用...
4. **序列化和反序列化**:调用对象的方法如`toString()`将JSON对象转换为字符串,使用`parse()`或`readObject()`方法将JSON字符串转换为Java对象。 5. **操作JSON**:通过API进行增删改查,如`put()`, `get()`, `...
除了`JSONObject`,`org.json`包还提供了其他类,如`JSONArray`用于处理JSON数组,`JSONStringer`和`JSONWriter`用于构建复杂的JSON结构,以及`JSONException`用于捕获处理JSON时可能出现的异常。这些工具类使得...
用Java编程语言进行编码和解码JSON对象所需要的jar包。。
5. `org.json.JSONException`:当JSON操作中出现错误时,会抛出这个异常。 源代码文件通常包含这些类的实现细节,对于学习和调试很有帮助。源代码可以让开发者了解内部工作原理,例如数据如何序列化和反序列化,...
JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式,因其简洁和高效而广泛应用于Web服务和应用程序之间的数据传输。在Java编程环境中,处理JSON数据通常需要借助于特定的库,比如`json.jar`和`org....
3. **JSONException**: 这是处理JSON时抛出的异常类,通常当JSON格式错误或者解析出错时会抛出。 4. **JSONStringer**: 提供了一种构建JSON字符串的方法,通过调用一系列的方法,可以构造出复杂的JSON结构。 5. **...
6. **性能优化**:`net.sf.json`库在设计时考虑了性能,采用了一些优化策略,比如缓存重复使用的JSON对象,以及在处理大量数据时的内存效率。 7. **错误处理**:库中的异常类如`JSONException`用于处理解析错误和...
《深入解析org.json.JSON库:从基础到进阶》 在Java编程中,处理JSON数据是一项常见的任务。org.json库是Java中一个轻量级、易于使用的JSON处理库,广泛应用于JSON的序列化和反序列化。本篇将详细介绍org.json.JSON...
在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。本文将详细讲解如何使用`json.org.jar`库在Android环境中解析JSON文件,帮助开发者理解这一过程。 首先,`...
5. **JSONException**:当解析、序列化或验证JSON时遇到错误,org.json库会抛出这个异常。通过捕获这个异常,开发者可以及时发现并处理问题。 6. **JSONTokener**:用于分隔和解析JSON文本,是JSONParser的基础。它...
5. **其他辅助类**: 包括`JSONException`,这是处理JSON操作时抛出的异常;`JSONPointerException`,当尝试访问不存在的JSON键时抛出;以及`JSONWriter`,用于构建复杂的JSON结构。 在学习`org.json`源码时,可以...
`json.org.jar` 是这个网站提供的一个Java实现的JSON处理库,适用于Java开发者在进行JSON数据的处理时使用。 此jar包的核心功能主要包括以下几个方面: 1. JSON对象(JSONObject):JSONObject是JSON中的对象结构...