0

0

如何正确解析嵌套的 JSONArray 和 JSONObject 结构

花韻仙語

花韻仙語

发布时间:2026-01-24 12:37:00

|

348人浏览过

|

来源于php中文网

原创

如何正确解析嵌套的 JSONArray 和 JSONObject 结构

本文详解使用 org.json 库遍历多层嵌套 json(含数组内对象、对象内对象等)的通用方法,重点解决“无法访问 array 数组中元素”这一常见问题,并提供可直接运行的结构化代码示例。

在处理真实业务中的 JSON 数据时,嵌套结构极为常见:外层是 JSONArray(如 "Data" 字段),其每个元素是 JSONObject;而该对象内部又可能包含 JSONArray(如 "array")、嵌套 JSONObject(如 "anotherData"),甚至存在键名含数字或空格的非常规字段(如 "1foo"、"some more data")。若不明确区分每层数据类型并按需调用对应 getter 方法,极易抛出 JSONException: JSONObject["xxx"] is not a string. 或 JSONException: JSONObject["array"] is not a JSONArray. 等异常。

核心原则是:“先判断类型,再取值” —— 每次从 JSON 容器中提取子项前,必须根据字段语义和结构预期,选择 getJSONObject()、getJSONArray() 或 getString() 等精确方法,不可混用。

以下为完整、健壮的解析流程(基于 org.json:json 2023+ 版本):

零一万物开放平台
零一万物开放平台

零一万物大模型开放平台

下载
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;

public class NestedJsonParser {
    public static List parseNestedJson(String rawJson) {
        List dataList = new ArrayList<>();
        JSONObject outer = new JSONObject(rawJson);
        JSONArray dataArr = outer.getJSONArray("Data"); // ✅ 正确:从根对象取 "Data" 数组

        for (int i = 0; i < dataArr.length(); i++) {
            JSONObject jsonEvent = dataArr.getJSONObject(i); // ✅ 正确:取第 i 个事件对象

            // 1️⃣ 解析顶层字段(字符串)
            String foo = jsonEvent.optString("foo", ""); // 推荐用 optXxx() 避免空指针
            String bar = jsonEvent.optString("bar", "");

            // 2️⃣ 解析嵌套 JSONArray:"array"
            JSONArray arrayJson = jsonEvent.getJSONArray("array"); // ✅ 必须用 getJSONArray()
            String first1foo = "";
            String second2foo = "";
            if (arrayJson.length() > 0) {
                JSONObject firstObj = arrayJson.getJSONObject(0); // ✅ 先取数组首元素(JSONObject)
                first1foo = firstObj.optString("1foo", "");
            }
            if (arrayJson.length() > 1) {
                JSONObject secondObj = arrayJson.getJSONObject(1);
                second2foo = secondObj.optString("2foo", "");
            }

            // 3️⃣ 解析嵌套 JSONObject:"anotherData"
            JSONObject anotherDataObj = jsonEvent.getJSONObject("anotherData"); // ✅ 必须用 getJSONObject()
            String foofoo = anotherDataObj.optString("foofoo", "");
            String barbar = anotherDataObj.optString("barbar", "");

            // 4️⃣ 解析含空格键名(注意:JSON 标准允许,但需严格匹配)
            String someMoreData = jsonEvent.optString("some more data", ""); // ✅ 键名含空格,必须原样书写

            // 封装为业务对象(示例 Data 类需提前定义)
            dataList.add(new Data(foo, bar, first1foo, second2foo, foofoo, barbar, someMoreData));
        }
        return dataList;
    }
}

? 关键注意事项:

  • ❌ 错误示范:jsonEvent.getString("array") → "array" 是数组,不是字符串,会崩溃;
  • ✅ 正确做法:jsonEvent.getJSONArray("array") → 明确声明期望类型;
  • ? 键名 "1foo" 合法但易被误判为非法标识符——它只是普通字符串键,无需转义,直接 getString("1foo") 即可;
  • ⚠️ "some more data" 含空格,必须原样传入键名字符串,不可写作 someMoreData;
  • ? 强烈推荐使用 optString(key, defaultValue) 替代 getString(key),避免因字段缺失导致 JSONException;
  • ? 若需深度遍历任意层级,可封装递归工具方法,但对固定结构,显式分层访问更清晰、高效、易调试。

通过严格遵循“类型驱动访问”原则,并结合 optXxx() 安全方法,即可稳定、准确地解析任意深度的嵌套 JSON,彻底告别 “Cannot cast to...” 异常。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.04

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

C# 教程
C# 教程

共94课时 | 7.4万人学习

Java 教程
Java 教程

共578课时 | 50.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号