json-libカスケード解析問題の解決


問題の解釈
カスケード解析はクラス間相互参照であり,たとえばクラスAにはクラスBの参照があり,クラスBにもクラスAの参照があり,この場合はHibernateでの双方向関連がよく見られる.この場合、json-lib解析の過程でnet.が現れる.sf.json.JSPONException:There is a cycle in the hierarchy異常.
解決策
1、json-libが提供するフィルタフィールドを採用する方法

JsonConfig config = new JsonConfig();
String[] excludeProperties = new String[]{
"propertyA","propertyB", "propertyC"
};
config.setExcludes(excludeProperties);
JSONObject jsonObject = JSONObject.fromObject(obj,config);
String jsonStr = jsonObject.toString();

2、JsonConfigの循環戦略を設定する

JsonConfig config = new JsonConfig();
config.setIgnoreDefaultExcludes(false);       
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
JSONObject jsonObject = JSONObject.fromObject(obj,config);
String jsonStr = jsonObject.toString();

CycleDetectionStrategyとは、ループ解析に遭遇した場合に使用されるポリシーです.
CycleDetectionStrategyには、次のような値があります.
LENIENT 
  Returns empty array and null object 
NOPROP 
  Returns a special object (IGNORE_PROPERTY_OBJ) 
      that indicates the entire property should be ignored 
STRICT 
  Throws a JSONException