You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:54:01