2012-02-02 48 views
1

Jackson處理/引發循環異常,如net.sf.json.JSONException:層次結構中存在循環!當它檢測到要在json中轉換的java對象中的循環時,在json-lib中拋出。如果是的話,我們該如何處理。傑克遜會拋出循環異常嗎?

錯誤JSON-lib的拋出是按照事先

1169 SEVERE: Servlet.service() for servlet JSONControllerServletGZIP threw exception 
    1170 net.sf.json.JSONException: There is a cycle in the hierarchy! 
    1171  at net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.handleRepeatedReferenceAsArray(CycleDetectionStra 
    1172  at net.sf.json.JSONArray._fromCollection(JSONArray.java:749) 
    1173  at net.sf.json.JSONArray.fromObject(JSONArray.java:165) 
    1174  at net.sf.json.JSONObject._processValue(JSONObject.java:2132) 
    1175  at net.sf.json.JSONObject._setInternal(JSONObject.java:2177) 
    1176  at net.sf.json.JSONObject.setValue(JSONObject.java:1005) 
    1177  at net.sf.json.JSONObject._fromMap(JSONObject.java:886) 
    1178  at net.sf.json.JSONObject.fromObject(JSONObject.java:248) 

感謝。

回答

0

不,傑克遜不會跟蹤循環實例,除了被捕獲的自引用的特例。正如所建議的那樣,目前處理此問題的最佳方法是使用註釋,至少在您有父/子樣式引用的情況下。

+0

謝謝。我正在使用Jackson將巨大而複雜的Java對象轉換爲JSON,它工作正常,但是由於對象的大尺寸,可能會出現問題,因此我們可以嘗試事先處理並解決它,因爲它是對我們的項目很重要。請指教。 – 2012-02-07 03:46:33

+0

如果使用樹模型(JsonNode),Jackson只包含完整的文檔數據;否則操作是增量式的,所以內存使用不應該是一個問題。但聽起來您更擔心重複 - 如果確實存在問題,您可能需要等待Jackson 2.0,它將增加對使用身份處理任意引用(即使用多個引用的對象ID)的支持。 – StaxMan 2012-02-07 16:43:22

+0

傑克遜2.0的價值在於全面支持消除週期和重複;有關詳細信息,請參閱javadocs for「@ JsonIdentityInfo」註釋。 – StaxMan 2012-07-16 17:48:30