本文详解如何在 android 中正确解析形如 {"users":[{...},{...}]} 的嵌套 json 数据,涵盖从顶层 jsonobject 提取 jsonarray、遍历对象及安全获取字段值的完整流程,并提供健壮的 java 示例代码与关键注意事项。
本文详解如何在 android 中正确解析形如 {"users":[{...},{...}]} 的嵌套 json 数据,涵盖从顶层 jsonobject 提取 jsonarray、遍历对象及安全获取字段值的完整流程,并提供健壮的 java 示例代码与关键注意事项。
在 Android 开发中,解析服务器返回的 JSON 数据是网络请求后的核心环节。初学者常误将整个 JSON 字符串直接当作 JSONArray 处理,导致 JSONException: Value ... of type org.json.JSONObject cannot be converted to JSONArray 异常——这正是原始代码中 new JSONArray(s) 报错的根本原因:该 JSON 响应是一个顶层为 JSONObject 的结构,其内部 "users" 字段才真正对应一个 JSONArray。
正确的解析逻辑需分三步进行:
- 先解析顶层 JSONObject:使用 new JSONObject(jsonString) 构造根对象;
- 从中提取命名数组:调用 getJSONArray("users") 获取目标数组;
- 遍历 JSONArray 并解析每个 JSONObject:通过 getJSONObject(i) 获取单个用户对象,再调用 getString()、getInt() 等方法提取字段。
以下是经过优化、生产可用的示例代码(适配 onPostExecute(String) 场景):
@Override
protected void onPostExecute(String response) {
super.onPostExecute(response);
if (response == null || response.trim().isEmpty()) {
Log.e("JSONParse", "Empty or null response received");
return;
}
try {
// Step 1: Parse root JSONObject
JSONObject root = new JSONObject(response);
// Step 2: Extract "users" JSONArray
JSONArray usersArray = root.getJSONArray("users");
// Step 3: Iterate and extract data safely
StringBuilder usernames = new StringBuilder();
for (int i = 0; i <p>✅ <strong>关键注意事项</strong>: </p>
- 永远不要跳过顶层对象:本例中 {"users":[...]} 是 JSONObject,不是 JSONArray;直接 new JSONArray(s) 必然崩溃。
- 优先使用 optXXX() 方法:如 optString("username", "default"),避免因字段缺失导致 JSONException;仅当确认字段必存在时才用 getString()。
- 注意 HTML 转义内容:示例 JSON 中的 email 字段包含 标签(Cloudflare 邮箱保护),若需纯文本邮箱,请结合 Html.fromHtml() 解析并提取 href 或 textContent。
- 异步线程安全:textView.setText() 必须在主线程执行(onPostExecute 已满足),切勿在子线程中更新 UI。
- 推荐升级方案:现代项目建议使用 Gson 或 Moshi 配合数据类(POJO)实现自动映射,大幅提升可维护性与类型安全性。
掌握这一嵌套解析模式,即可从容应对绝大多数 REST API 返回的 JSON 结构,为构建稳定网络层打下坚实基础。










