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

Android中解析包含两个数组的嵌套JSON时获取null值问题排查

问题排查:JSON解析返回null的原因及正确写法

首先咱们先把你拿到的eresult的JSON结构拆解清楚,这是解决问题的核心:

{
  "elcldata": {
    "elapplied": [ // 这是一个JSON数组,内部包含单个对象
      {
        "lvLeavetype": "EL",
        "lvLeaveStatus": "Applied"
      }
    ],
    "elclbal": [ // 同样是JSON数组,内部包含单个对象
      {
        "levELBal": "29",
        "levCLBal": "2"
      }
    ]
  }
}

接下来逐个分析你四种解析方式的错误:

方式一的问题

JSONObject eobject = new JSONObject(eresult);
String myString = eobject.getJSONObject("elclbal").getString("levELBal");
  • elclbal并不在最外层对象中,它是嵌套在elcldata对象里的;
  • 而且elclbal是JSON数组,不是JSONObject,直接用getJSONObject()会抛出异常或者返回null。

方式二的问题

JSONObject eobject = new JSONObject(eresult);
String myString = eobject.getJSONObject("elapplied").getJSONObject("elclbal").getString("levELBal");
  • elapplied和elclbal是elcldata下的同级元素,不是嵌套关系,你没法从elapplied里拿到elclbal;
  • 另外elapplied本身是数组,不能用getJSONObject()获取。

方式三的问题

JSONObject eobject = new JSONObject(eresult);
String myString = eobject.getJSONObject("elcldata").getJSONObject("elclbal").getString("levELBal");
  • 这里层级是对的(先拿到了elcldata),但elclbal是数组不是JSONObject,用getJSONObject()去获取肯定拿不到正确值,只会返回null或抛出异常。

方式四的问题

JSONObject elappObject = eobject.getJSONObject("elapplied");
JSONObject balObject = elappObject.getJSONObject("elclbal");
JSONArray ejarray = balObject.getJSONArray("elclbal");
// ...后续代码
  • 逻辑完全混乱:elapplied是数组不是对象,不能用getJSONObject();而且elclbal和elapplied是同级,根本不在elapplied内部,后续的数组操作自然全错了。

正确的解析写法

严格按照JSON的层级结构,先取外层对象,再拿到elcldata,然后分别处理两个数组:

try {
    JSONObject eobject = new JSONObject(eresult);
    // 第一步:获取elcldata对象
    JSONObject elcldata = eobject.getJSONObject("elcldata");
    
    // 处理elapplied数组
    JSONArray elappliedArray = elcldata.getJSONArray("elapplied");
    if (elappliedArray.length() > 0) {
        JSONObject appliedObj = elappliedArray.getJSONObject(0);
        String lvLeavetype = appliedObj.getString("lvLeavetype");
        String lvLeaveStatus = appliedObj.getString("lvLeaveStatus");
        // 这里可以使用这两个变量
    }
    
    // 处理elclbal数组
    JSONArray elclbalArray = elcldata.getJSONArray("elclbal");
    if (elclbalArray.length() > 0) {
        JSONObject balObj = elclbalArray.getJSONObject(0);
        String levELBal = balObj.getString("levELBal");
        String levCLBal = balObj.getString("levCLBal");
        // 这里可以使用这两个变量
    }
} catch (JSONException e) {
    e.printStackTrace();
    // 捕获解析异常,方便调试时定位问题
}

要点总结:

  • 必须严格对应JSON的层级结构,不要跨层级或找错父子关系;
  • 明确区分JSONArray和JSONObject,数组用getJSONArray(),对象用getJSONObject();
  • 加上异常捕获,调试时能快速定位解析过程中的问题。

内容的提问来源于stack exchange,提问作者SNAD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:08:11