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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:51:37