ply

          吞噬黑暗
          posts - 1, comments - 11, trackbacks - 0, articles - 13
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy!

          遇到了一些問題,如hibernate延遲加載錯誤,這都是老掉牙的問題了,一看就知道加個lazy=flase就OK了。想不到快要完成了又遇到了新的問題,JSON死循環(huán),實在讓人郁悶。異常如下:


          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
          >


          仔細查了一下發(fā)現(xiàn)是hibernate主外鍵關(guān)聯(lián)的錯,后來就想下json源代碼下來看,發(fā)現(xiàn)大費周章都沒搞到json源碼,還是老辦法反編譯瞅瞅,發(fā)現(xiàn)JSONArray根據(jù)判斷取得的不同類型調(diào)用相應的方法,

          if (object instanceof Collection)
              return _fromCollection((Collection)object, jsonConfig);

          而我從hibernate那得到的是list,所以去調(diào)用了_fromCollection方法,而里面的方法發(fā)現(xiàn)一個問題:該方法會不斷的拆開實體屬性,直到?jīng)]有為止,而我的ContactGroup里有兩個屬性用于自身關(guān)聯(lián)

          private Set contactGroups = new HashSet(0);
          private Set contactGroupPersons = new HashSet(0);


          也就是說主外鍵自身關(guān)聯(lián)的是個死循環(huán),那怎么才能不讓他出現(xiàn)這種情況呢,應該有個配置的參數(shù)后者終止循環(huán)的地方吧,查看發(fā)
          現(xiàn),jsonConfig,呵呵,config應該是配置參數(shù)吧,參看JsonConfig看見巨多的屬性,有點暈PropertyFilter
          ,不提了,看了老半天,發(fā)現(xiàn)了一個屬性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產(chǎn)生的實體bean中的contactGroups和contactGroupPersons過濾掉就OK了!

          然后調(diào)用JSONArray.fromObject(mychildren,cfg); mychildren是hibernate返回的list。

           

           1List<ShoppingCart> listCarts = sCartServiceImpl
           2                        .ShoppingCartTable(shoppingCart);
           3                // 先過濾對set集合的拆解
           4                JsonConfig config = new JsonConfig();
           5                config.setJsonPropertyFilter(new PropertyFilter() {
           6                    @Override
           7                    public boolean apply(Object arg0, String arg1, Object arg2) {
           8                        if (arg1.equals("shoppingCarts")) {
           9                            return true;
          10                        }
           else {
          11                            return false;
          12                        }

          13                    }

          14                }
          );
          15                // 將數(shù)據(jù)轉(zhuǎn)換成Json數(shù)據(jù)
          16                JSONArray jsonObject = JSONArray.fromObject(listCarts, config);
          17                System.out.println(jsonObject.toString());
          18

          搞了一下午,參考網(wǎng)絡的資料!解決問題了!


          評論

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2012-06-26 15:22 by cfm
          請問這個PropertyFilter接口怎么調(diào)用啊 我在類上實現(xiàn)這個接口編譯不通過

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2012-12-07 13:49 by upup
          @cfm
          你只要把這個接口當成一個參數(shù)放到fromObject里面就行了。
          JSONArray jsonObject = JSONArray.fromObject(listCarts, config);

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy [未登錄]  回復  更多評論   

          2012-12-11 16:30 by Rose
          太感謝了,我正好碰到這個問題了。

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2013-09-16 09:25 by taojie
          請問要在哪里重寫呢?為什么這里老是報這個異常

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2013-09-16 09:41 by taojie
          shoppingCarts指的是哪里的屬性還是?

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2013-10-25 11:51 by er
          根本就行不通

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2013-11-26 14:31 by vf
          vddv

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2014-04-17 15:57 by hong0220
          已經(jīng)解決了,好用啊

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy   回復  更多評論   

          2014-05-02 11:01 by @jack
          不錯是那個問題,出現(xiàn)了死循環(huán),只要把實體中相應的屬性過濾掉就OK,頂

          # re: jQuery調(diào)用JSON時,net.sf.json.JSONException: There is a cycle in the hierarchy [未登錄]  回復  更多評論   

          2016-03-01 17:13 by monkey
          樓主太給力了,謝謝你的分享,好人一生平安!!!

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 重庆市| 红原县| 闻喜县| 收藏| 云南省| 金门县| 合山市| 二手房| 舒兰市| 鸡西市| 金溪县| 普宁市| 六盘水市| 鸡东县| 罗定市| 分宜县| 吉安市| 金山区| 五家渠市| 铜梁县| 东源县| 广东省| 高雄市| 贡嘎县| 永州市| 曲阜市| 元朗区| 富民县| 乡宁县| 保定市| 湖北省| 突泉县| 西峡县| 固安县| 平昌县| 丰都县| 西安市| 屏东县| 准格尔旗| 额尔古纳市| 化隆|