嘿 调用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
答案 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的应用程序,则可以修复它以将“技能”对象放入数组中,即使只有一个。