jQuery调用JSON时,net.sf.json.JSONException: There is a cycle in the hierarchy!
遇到了一些问题,如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.fromObject(mychildren,cfg); mychildren是hibernate返回的list。
/**
* 防止死循环的
* @param map
*/
public void writerMap2Json2(Map map) {
// 先过滤对set集合的拆解
JsonConfig cfg = new JsonConfig();
cfg.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object arg0, String arg1, Object arg2) {
if (arg1.equals("user")) {
return true;
} else {
return false;
}
}
});
try {
getHttpResponse().setContentType("text/json;charset=UTF-8");
getHttpResponse().setCharacterEncoding("UTF-8");
cfg.registerJsonValueProcessor(Date.class,new JsonValueProcessorImpl());
cfg.registerJsonValueProcessor(Timestamp.class, new JsonTimestampValueProcessorImpl());
getHttpResponse().getOutputStream().write(JSONObject.fromObject(map, cfg).toString().getBytes("UTF-8"));
getHttpResponse().getOutputStream().flush();
getHttpResponse().getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
分享到:
相关推荐
如果需要解析的数据间存在级联关系,而互相嵌套引用,在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!...
6. **性能优化**:`net.sf.json`库在设计时考虑了性能,采用了一些优化策略,比如缓存重复使用的JSON对象,以及在处理大量数据时的内存效率。 7. **错误处理**:库中的异常类如`JSONException`用于处理解析错误和...
3. **JSONException**: 这是处理JSON时抛出的异常类,通常当JSON格式错误或者解析出错时会抛出。 4. **JSONStringer**: 提供了一种构建JSON字符串的方法,通过调用一系列的方法,可以构造出复杂的JSON结构。 5. **...
5. **JSONException**: 当在处理JSON过程中遇到错误时,`JSONException`会被抛出。比如,当尝试访问不存在的键,或者JSON格式不正确时,都会抛出这个异常。 除了这些基本的类,`org.json.jar`还提供了其他一些实用...
4. **序列化和反序列化**:调用对象的方法如`toString()`将JSON对象转换为字符串,使用`parse()`或`readObject()`方法将JSON字符串转换为Java对象。 5. **操作JSON**:通过API进行增删改查,如`put()`, `get()`, `...
用Java编程语言进行编码和解码JSON对象所需要的jar包。。
2. `json-lib-2.4-jdk15.jar`:这是一个基于Net.sf.json的库,适用于多种Java环境,包括JDK1.5。它提供了与json.jar和org.json.jar类似的功能,同时也支持其他数据源,如DOM、SAX和Hibernate。 3. `json-path-0.8.1...
除了`JSONObject`,`org.json`包还提供了其他类,如`JSONArray`用于处理JSON数组,`JSONStringer`和`JSONWriter`用于构建复杂的JSON结构,以及`JSONException`用于捕获处理JSON时可能出现的异常。这些工具类使得...
1. 错误处理:在进行JSON操作时,需捕获JSONException异常,确保程序的健壮性。 2. 性能考虑:org.json库虽然轻量,但在处理大量数据时性能可能不如Gson或Jackson库。根据项目需求选择合适的库。 3. 版本差异:题目...
5. **其他辅助类**: 包括`JSONException`,这是处理JSON操作时抛出的异常;`JSONPointerException`,当尝试访问不存在的JSON键时抛出;以及`JSONWriter`,用于构建复杂的JSON结构。 在学习`org.json`源码时,可以...
5. **JSONException**:当解析、序列化或验证JSON时遇到错误,org.json库会抛出这个异常。通过捕获这个异常,开发者可以及时发现并处理问题。 6. **JSONTokener**:用于分隔和解析JSON文本,是JSONParser的基础。它...
在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。本文将详细讲解如何使用`json.org.jar`库在Android环境中解析JSON文件,帮助开发者理解这一过程。 首先,`...
`json.org.jar` 是这个网站提供的一个Java实现的JSON处理库,适用于Java开发者在进行JSON数据的处理时使用。 此jar包的核心功能主要包括以下几个方面: 1. JSON对象(JSONObject):JSONObject是JSON中的对象结构...
3. **JSONException**:当JSON解析过程中出现错误时抛出的异常。 使用`org.json`库解析JSON的基本步骤如下: 1. **读取JSON数据**:通常从网络请求或本地文件中获取JSON字符串。 2. **创建解析对象**:根据JSON...