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クラスのすべての属性は通常の属性でなければならず、参照を含まないオブジェクト
参照オブジェクトを含む場合は、一般的にフィルタ参照属性を設定する必要があります.これにより、JSON処理は通過します.これは参照オブジェクトを出力しません.
リファレンスオブジェクトを出力する処理もあります
JSON-LIBのsetCycleDetectionStrategyプロパティを設定してループを自分で処理します.手間は省けますが、データが複雑すぎるとデータオーバーフローや効率が低下します.
このエラーを処理する前に通常の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);