调用org.json.JSONObject.getJSONArray时的奇怪行为

时间:2011-04-21 14:12:33

标签: java android json getjson

嘿 调用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”} at   org.json.JSONObject类型的技能   无法转换为JSONArray           at org.json.JSON.typeMismatch(JSON.java:96)           at org.json.JSONObject.getJSONArray(JSONObject.java:548)   ....

这有道理吗?我真的必须捕获异常并处理这种特定的数组吗?

谢谢, UDI

2 个答案:

答案 0 :(得分:4)

每当您使用try / catch块检索JSON对象时,都会围绕您的代码。这样,当您获得任何意外的JSON对象时,程序将继续运行。

至于你的错误,当只有一个项目时,你的JSONArray“技能”似乎没有存储为数组。如果您使用Web服务来创建JSON对象,则问题可能在于Web服务。

答案 1 :(得分:4)

在你正在阅读的JSON中,当有一个元素时,它可能有类似的东西:

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

而不是:

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

请注意单个对象与包含单个对象的数组之间的区别。在您的代码中,您使用getJSONArray来请求数组,当它不是数组时会导致异常。

在使用getJSONArray之前,您需要检查“技能”的值是否为数组,或者假设它是一个数组并捕获异常以处理单个对象的情况。或者,如果您可以修改生成JSON的应用程序,则可以修复它以将“技能”对象放入数组中,即使只有一个。