`

jQuery调用JSON时,net.sf.json.JSONException: There is a cycle in the hierarchy!(

    博客分类:
  • Java
阅读更多
在实现会议自动邮件通知时,遇到了一些问题,如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>
分享到:
评论

相关推荐

    json-lib出现There is a cycle in the hierarchy解决办法

    如果需要解析的数据间存在级联关系,而互相嵌套引用,在hibernate中极容易嵌套而抛出net.sf.json.JSONException: There is a cycle in the hierarchy异常。

    net.sf.json.JSONObject相关jar包.zip

    6. **错误处理**:在处理JSON时,需要捕获JSONException,这是一个在解析、序列化或验证JSON时可能会抛出的异常。 7. **与其他数据类型转换**:JSONObject支持与Java基本类型、集合、Map等之间的转换,提供便利的...

    用于java对象与json对象间的相互转换(net.sf.json.JSONObject)

    在Java开发中,数据交换和存储常常涉及到JSON(JavaScript Object Notation)格式,因为它轻量级、易读写且被广泛支持。`net.sf.json.JSONObject`是开源库Apache Commons的一个组件,提供了Java对象与JSON对象之间的...

    JSONException:com.alibaba.fastjson.JSONException: expect ‘:’ at 0, actual = 已解决

    在编程过程中,我们可能会遇到各种异常,其中"JSONException: expect ‘:’ at 0, actual =" 是一个典型的Fastjson库在解析JSON时抛出的异常。Fastjson是阿里巴巴提供的一款高性能的JSON解析和生成库,它广泛应用于...

    net.sf.json jar包

    7. **错误处理**:当解析JSON字符串或生成JSON对象时,如果遇到问题,`net.sf.json`会抛出异常,如`JSONException`,帮助开发者定位并解决问题。 总之,`net.sf.json`是一个强大的Java JSON处理库,它提供了一整套...

    S2S3H3整合以及泛型Dao与Service封装

    并且对Dao和Service进行了封装,内含.jar包,并且解决了一对多双向关联的could not initialize proxy - no Session错误,同时解决了……invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!...

    Java下的json解析工具包:org.json.jar包

    5. **JSONException**: 当在处理JSON过程中遇到错误时,`JSONException`会被抛出。比如,当尝试访问不存在的键,或者JSON格式不正确时,都会抛出这个异常。 除了这些基本的类,`org.json.jar`还提供了其他一些实用...

    json_jar_JSON_json.jar_

    4. **序列化和反序列化**:调用对象的方法如`toString()`将JSON对象转换为字符串,使用`parse()`或`readObject()`方法将JSON字符串转换为Java对象。 5. **操作JSON**:通过API进行增删改查,如`put()`, `get()`, `...

    org.json.JSONObject引用依赖包

    除了`JSONObject`,`org.json`包还提供了其他类,如`JSONArray`用于处理JSON数组,`JSONStringer`和`JSONWriter`用于构建复杂的JSON结构,以及`JSONException`用于捕获处理JSON时可能出现的异常。这些工具类使得...

    Java json 解析json.jar

    用Java编程语言进行编码和解码JSON对象所需要的jar包。。

    json 2.1 jar包和源文件

    5. `org.json.JSONException`:当JSON操作中出现错误时,会抛出这个异常。 源代码文件通常包含这些类的实现细节,对于学习和调试很有帮助。源代码可以让开发者了解内部工作原理,例如数据如何序列化和反序列化,...

    json.jar与org.json.jar包

    JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式,因其简洁和高效而广泛应用于Web服务和应用程序之间的数据传输。在Java编程环境中,处理JSON数据通常需要借助于特定的库,比如`json.jar`和`org....

    org.json.jar工具包下载(可用)

    3. **JSONException**: 这是处理JSON时抛出的异常类,通常当JSON格式错误或者解析出错时会抛出。 4. **JSONStringer**: 提供了一种构建JSON字符串的方法,通过调用一系列的方法,可以构造出复杂的JSON结构。 5. **...

    json lib net.sf.json使用的所有jar包

    6. **性能优化**:`net.sf.json`库在设计时考虑了性能,采用了一些优化策略,比如缓存重复使用的JSON对象,以及在处理大量数据时的内存效率。 7. **错误处理**:库中的异常类如`JSONException`用于处理解析错误和...

    org.json.JSON.zip

    《深入解析org.json.JSON库:从基础到进阶》 在Java编程中,处理JSON数据是一项常见的任务。org.json库是Java中一个轻量级、易于使用的JSON处理库,广泛应用于JSON的序列化和反序列化。本篇将详细介绍org.json.JSON...

    JAVA解析json文件(使用json.org.jar)

    在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。本文将详细讲解如何使用`json.org.jar`库在Android环境中解析JSON文件,帮助开发者理解这一过程。 首先,`...

    org.json-source.zip

    5. **JSONException**:当解析、序列化或验证JSON时遇到错误,org.json库会抛出这个异常。通过捕获这个异常,开发者可以及时发现并处理问题。 6. **JSONTokener**:用于分隔和解析JSON文本,是JSONParser的基础。它...

    json-src.zip org.json源码

    5. **其他辅助类**: 包括`JSONException`,这是处理JSON操作时抛出的异常;`JSONPointerException`,当尝试访问不存在的JSON键时抛出;以及`JSONWriter`,用于构建复杂的JSON结构。 在学习`org.json`源码时,可以...

    json.org.jar

    `json.org.jar` 是这个网站提供的一个Java实现的JSON处理库,适用于Java开发者在进行JSON数据的处理时使用。 此jar包的核心功能主要包括以下几个方面: 1. JSON对象(JSONObject):JSONObject是JSON中的对象结构...

Global site tag (gtag.js) - Google Analytics