如何用org.json访问嵌套JSON中的数组与对象元素?
JSON结构混合对象/数组时的元素访问问题
问题场景
需要读取的JSON结构示例:
{ "Data": [ { "foo": "22", "bar": "33", "array": [ { "1foo": "22", "1bar": "33" }, { "2foo": "22", "2bar": "33" } ], "anotherData": { "foofoo": "22", "barbar": "33" }, "some more data": "11" }, { "foo": "22", "bar": "33", "array": [ // 后续结构重复 ] } ] }
使用org.json库时,无法访问array字段下的1foo等元素,尝试多种JSONObject/JSONArray组合均无效,当前代码如下:
List<Data> data= new ArrayList<>(); String rawJson = getJsonAsString(); JSONObject outer = new JSONObject(rawJson); JSONArray jArr= outer.getJSONArray("Data"); JSONObject inner= outer.getJSONObject("array"); // 错误代码 for(int i =0; i<jArr.length(); i++){ JSONObject jsonEvent = jArr.getJSONObject(i); String foo = jsonEvent.getString("foo"); // 这行有效 String 1foo = jsonEvent.getString("1foo"); // 这行无效,无法访问 }
解决方案
1. 修正核心错误
你的代码中JSONObject inner= outer.getJSONObject("array");完全错误——array是Data数组中每个对象的内部字段,并非外层JSON的属性。要访问1foo,必须先从Data数组的每个元素中取出array数组,再遍历该数组获取内部对象。
2. 正确解析嵌套数组
修正后的代码示例:
List<Data> data = new ArrayList<>(); String rawJson = getJsonAsString(); JSONObject outer = new JSONObject(rawJson); JSONArray dataArr = outer.getJSONArray("Data"); for (int i = 0; i < dataArr.length(); i++) { JSONObject jsonEvent = dataArr.getJSONObject(i); // 成功获取外层对象的foo字段 String foo = jsonEvent.getString("foo"); // 取出当前对象中的array数组 JSONArray innerArray = jsonEvent.getJSONArray("array"); // 遍历array数组中的每个子对象 for (int j = 0; j < innerArray.length(); j++) { JSONObject arrayItem = innerArray.getJSONObject(j); // 注意:Java变量名不能以数字开头,需修改为合法名称 String oneFoo = arrayItem.getString("1foo"); String oneBar = arrayItem.getString("1bar"); // 此处可将数据存入自定义的Data对象 } }
3. 处理对象/数组混合的场景
如果某个字段可能是JSONObject也可能是JSONArray,不要直接用getJSONArray或getJSONObject,先判断类型再处理:
// 以可能混合类型的字段"someField"为例 Object fieldObj = jsonEvent.get("someField"); if (fieldObj instanceof JSONArray) { JSONArray fieldArr = (JSONArray) fieldObj; // 处理数组逻辑,比如遍历每个元素 } else if (fieldObj instanceof JSONObject) { JSONObject fieldObj = (JSONObject) fieldObj; // 处理单个对象逻辑,比如获取内部字段 }
也可以用org.json的opt系列方法简化判断:
JSONArray arr = jsonEvent.optJSONArray("someField"); if (arr != null) { // 数组处理逻辑 } else { JSONObject obj = jsonEvent.optJSONObject("someField"); // 对象处理逻辑 }
额外注意点
- Java变量名不能以数字开头,因此
String 1foo是语法错误,必须改为oneFoo这类合法名称。 - 确保JSON结构合法:你提供的示例中有多余的逗号(比如
"2bar":"33",),解析前需修正这类语法错误,否则org.json会抛出解析异常。
内容的提问来源于stack exchange,提问作者Bajter
相关产品推荐
相关产品推荐

