JSON処理Hibernateエンティティークラスnet.sf.json.JSONException:There is a cycle in the hierarchy異常


Hibernateの多くのエンティティークラス、すなわちクラスがカスケードされているため、他のクラスの参照オブジェクトが属性として機能します.では、JSONで処理するとネストされた異常が発生します:net.sf.json.JSPONException:There is a cycle in the hierarchy異常.
このエラーを処理する前に通常のJSON処理データ例を見ておく
TProcessInfoDAO dao = new TProcessInfoDAO();
   List<TProcessInfo> orgData = dao.findAll();
   JSONArray array=JSONArray.fromObject(orgData);
   String json=array.toString();
   System.out.println(json);

 
このような処理では、TProcessInfoDAOクラスのすべての属性は通常の属性でなければならず、参照を含まないオブジェクト
参照オブジェクトを含む場合は、一般的にフィルタ参照属性を設定する必要があります.これにより、JSON処理は通過します.これは参照オブジェクトを出力しません.
TProcessInfoDAO dao = new TProcessInfoDAO();
   List<TProcessInfo> orgData = dao.findAll();
   JsonConfig config = new JsonConfig();
   config.setJsonPropertyFilter(new PropertyFilter() {
   public boolean apply(Object source, String name, Object value) {
   //            
   if (name.equals("TProcessInfos") || name.equals("TProcessInfo")) {
   return true;
   } else {
   return false;
   }
   }
   });
  
   //  ExtHelper   JSONConfig    
   JSONArray JsonArr=JSONArray.fromObject(orgData, config);
   String jsonstr=JsonArr.toString();

リファレンスオブジェクトを出力する処理もあります
JSON-LIBのsetCycleDetectionStrategyプロパティを設定してループを自分で処理します.手間は省けますが、データが複雑すぎるとデータオーバーフローや効率が低下します.
 
TProcessInfoDAO dao = new TProcessInfoDAO();
		 List<TProcessInfo> orgData = dao.findAll();
		JsonConfig config = new JsonConfig();    
		 config.setIgnoreDefaultExcludes(false);       
		 config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
		 //  ExtHelper   JSONConfig    
		 JSONArray JsonArr=JSONArray.fromObject(orgData, config);
		 String jsonstr=JsonArr.toString();
		 System.out.println(jsonstr);