Android解析LoL英雄JSON报错:org.json.JSONException: No value for Aatrox
问题排查:org.json.JSONException: No value for Aatrox
嘿,我一眼就揪出你代码里的问题啦,咱们来快速搞定这个JSON解析的bug~
核心错误原因
你已经正确拿到了包含所有英雄数据的champions对象(也就是json.getJSONObject("data")的结果),但在循环遍历键值对的时候,犯了一个小疏忽:你从外层的根json对象里去取key对应的值,而不是从champions对象里获取!
外层根JSON里根本不存在"Aatrox"这个键——它是嵌套在data字段下面的,所以调用json.get(key)自然会抛出找不到值的异常。
修正后的代码
把setupChampionData方法里的循环部分修改一下,从champions对象中读取对应英雄的数据:
private void setupChampionData() { createRequest("http://ddragon.leagueoflegends.com/cdn/7.24.1/data/en_US/champion.json", new VolleyCallback() { @Override public void onSuccess(Object response) { JSONObject json = ((JSONObject) response); try { JSONObject champions = json.getJSONObject("data"); Iterator<String> temp = champions.keys(); System.out.println(json.toString()); while (temp.hasNext()) { String key = temp.next(); // 关键修改:从champions对象获取值,而非外层json JSONObject value = champions.getJSONObject(key); championData.put(value.getInt("key"), value); } } catch (Exception e) { e.printStackTrace(); } } }); }
额外优化建议
为了让代码更健壮,你可以用optJSONObject替代getJSONObject,这样如果某个英雄数据格式异常时,不会直接抛出异常而是返回null,方便你做容错处理:
JSONObject value = champions.optJSONObject(key); if (value != null) { championData.put(value.getInt("key"), value); }
内容的提问来源于stack exchange,提问作者IcyRelic
相关产品推荐
相关产品推荐

