2011-04-21 21 views
0

嘿, 當我調用getJSONArray時,我注意到了這種奇怪的行爲。 這是我的代碼:調用時怪異的行爲org.json.JSONObject.getJSONArray

JSONObject jsonObject = new JSONObject(data); 
if (!jsonObject.getJSONObject("transfer").has("skill")) 
    return Collections.emptyList(); 
JSONArray events = jsonObject.getJSONObject("transfer").getJSONArray("skill"); 

現在,每當轉移已超過1組技能的元素,一切都很正常,但如果只有1個技能元素,即時得到一個例外:

引起:org.json.JSONException: 價值{「id」:「2」,「name」:「DOGS」}在 類型org.json.JSONObject的技能 無法轉換爲JSONArray at org.json.JSON。 typeMismatch(JSON.java:96) at org.json.JSONObject.getJSONArray(JSONObject.java:548) ....

這是否合理?我真的需要捕捉異常並處理這種特定的數組嗎?

感謝, 烏迪

回答

4

任何時候你檢索一個JSON對象,圍繞你的代碼用try/catch塊。這樣,當您收到任何意外的JSON對象時,您的程序將繼續運行。

至於你的錯誤,它看起來像只有一個項目時,你的JSONArray「技能」不被存儲爲數組。如果您使用Web服務創建JSON對象,則問題可能出在Web服務上。

4

在您正在閱讀的JSON,當有一個元素,它可能有類似:

skill: {"id":"2","name":"DOGS"} 

而不是:

skill: [{"id":"2","name":"DOGS"}] 

注意單個對象和數組之間的區別即包含單個對象。在你的代碼中,你使用getJSONArray來請求一個數組,當它不是數組時,會產生一個異常。

您需要在使用getJSONArray之前檢查「skill」的值是否爲數組,或者假定它是一個數組並且捕獲異常以處理單個對象大小寫。或者,如果您可以修改生成JSON的應用程序,那麼即使只有一個,您也可以修復它以將「技能」對象放入數組中。