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
相关产品推荐
相关产品推荐

