
本文详解如何使用 org.json 库准确访问 json 中多层嵌套的数组与对象结构,重点纠正常见语法错误(如误用 getjsonarray 代替 getjsonobject),并通过修正后的代码演示安全、可读的层级遍历方法。
在 Java 中解析复杂 JSON 数据时,一个常见误区是混淆 getJSONObject() 与 getJSONArray() 的使用场景——尤其当 JSON 结构包含“数组中嵌套对象,对象中再嵌套对象”时(如 "user": [{ "info": { "name": "user 1" } }])。原始代码:
jsonObject.getJSONArray("user").getJSONArray(0).getJSONArray("info").getString("name")存在三处关键错误:
- user 数组的第 0 个元素是 JSON 对象({ "info": { ... } }),不是 JSONArray,因此不能调用 getJSONArray(0);
- info 字段本身也是一个 JSON 对象,而非数组,故 getJSONArray("info") 会抛出 JSONException;
- 调用链过长且未做空值/类型校验,一旦某一层级缺失或类型不符,程序将直接崩溃。
✅ 正确做法是逐层判断类型、分步获取,并优先使用语义明确的方法:
JSONObject obj = new JSONObject(jsonString);
JSONArray userArray = obj.getJSONArray("user"); // 获取 user 数组
JSONObject firstUser = userArray.getJSONObject(0); // 获取数组首项(JSONObject)
JSONObject infoObj = firstUser.getJSONObject("info"); // 获取 info 对象
String userName = infoObj.getString("name"); // 安全提取 name 字符串
System.out.println(userName); // 输出:user 1? 重要注意事项:
立即学习“Java免费学习笔记(深入)”;
- 始终确保 JSON 字符串格式合法(您提供的示例中 0: 是非法键名 —— JSON 对象键必须为字符串,如 "0" 或直接省略索引;实际应为 [{"info": {"name": "user 1"}}]);
- 生产环境建议添加异常处理与空值检查:
if (obj.has("user") && !obj.isNull("user")) {
JSONArray users = obj.getJSONArray("user");
if (users.length() > 0) {
JSONObject first = users.getJSONObject(0);
if (first.has("info") && !first.isNull("info")) {
String name = first.getJSONObject("info").optString("name", "N/A");
System.out.println("Name: " + name);
}
}
}使用 optString(key, defaultValue) 可避免 JSONException,提升鲁棒性。掌握类型匹配与分步解析,是可靠处理任意深度嵌套 JSON 的基础。










