Java Android 如何从嵌套JSONObject中提取fields下0-4对应name值避免空错误
Android JSONObject解析可选键缺失异常解决方法
问题原因
- 原生
org.json.JSONObject的getString()、getJSONObject()等get系列方法,当指定键不存在,或者值类型和调用方法要求的类型不匹配时,会直接抛出JSONException,不会返回null - 你现有代码存在逻辑错误:键
"0"对应的值是JSONObject类型,你先调用jo.getString("0")会直接触发类型不匹配异常,和键是否存在无关
修复方案
推荐使用optXXX系列方法替代get系列方法,这类方法不会抛出异常,找不到对应键/类型不匹配时会直接返回null或者你指定的默认值,非常适合解析可选字段的场景:
public void onResponse(String response) { try { JSONArray jsonArray = new JSONArray(response); // 预先定义所有需要提取的目标键,避免重复写判断逻辑 String[] targetFieldKeys = new String[]{"0", "1", "2", "3", "4"}; for (int i = 0; i < jsonArray.length(); i++) { JSONObject itemObj = jsonArray.getJSONObject(i); // optString第二个参数为默认值,字段不存在时会返回该默认值 String bankName = itemObj.optString("name", "未知机构"); JSONObject fieldsObj = itemObj.optJSONObject("fields"); // 没有fields字段直接跳过当前条目 if (fieldsObj == null) continue; // 遍历所有目标键 for (String key : targetFieldKeys) { JSONObject fieldItem = fieldsObj.optJSONObject(key); // 键不存在/值类型不对的情况下fieldItem为null,直接跳过即可 if (fieldItem != null) { String fieldName = fieldItem.optString("name", "未命名字段"); Log.d("字段" + key + "名称", fieldName); // 此处可添加你的业务逻辑,将字段值存入对应的实体类 } } } } catch (JSONException e) { // 此处仅需捕获整个JSON结构错误的通用异常即可 e.printStackTrace(); } }
补充说明
如果需要兼容更低版本的系统,也可以用has()方法先判断键是否存在,再调用get系列方法取值,效果和上述写法一致:
if (fieldsObj.has(key)) { JSONObject fieldItem = fieldsObj.getJSONObject(key); String fieldName = fieldItem.getString("name"); }
内容的提问来源于stack exchange,提问作者AndroWaqar
相关产品推荐
相关产品推荐

