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

Android中如何正确解析JSON对象内的user节点数据?

问题分析与解决方案

你遇到的错误非常典型——你把一个单个的JSON对象({}包裹)错误地当成了JSON数组([]包裹)来解析。从你的Log输出可以看到,decoded的内容是一个完整的顶层JSON对象,其中user是这个对象下的一个子对象,而不是数组,所以尝试用JSONArray jsonArray = new JSONArray(decoded)必然会抛出类型不匹配的异常。

正确的解析步骤

要获取user节点内的数据,你只需要从顶层的JSONObject中直接取出user对应的子对象即可,不需要转成数组。以下是修正后的代码:

public void onResponse(String response) {
    try {
        jsonObject = new JSONObject(response);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    try {
        String token = jsonObject.getString("result");
        String decoded = DecodeToken.decoded(token);
        JSONObject topObj = new JSONObject(decoded);
        
        // 获取顶层字段(你原来的代码这部分是对的)
        String sub = topObj.getString("sub");
        Log.d("MyLogs", "sub: " + sub);
        Log.d("MyLogs", "decoded content: " + decoded);
        
        // 关键步骤:获取user子对象,而不是转数组
        JSONObject userObj = topObj.getJSONObject("user");
        
        // 从user对象中获取具体字段
        String userId = userObj.getString("userId");
        String userEmail = userObj.getString("userEmail");
        String userPhone = userObj.getString("userPhone");
        String userFirstName = userObj.getString("userFirstName");
        
        // 输出测试
        Log.d("GMap", "userId: " + userId);
        Log.d("GMap", "userEmail: " + userEmail);
        
        // 注意:对于可能为null的字段(比如userAccountType),建议用optString避免异常
        String accountType = userObj.optString("userAccountType", "默认值");
        Log.d("GMap", "accountType: " + accountType);
        
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

核心注意事项

  1. 区分JSON对象和数组:

    • 用{}包裹的是JSON对象,对应代码中的JSONObject
    • 用[]包裹的是JSON数组,对应代码中的JSONArray
      你的返回数据里user是一个对象,不是数组,所以直接用getJSONObject("user")获取。
  2. 避免变量名冲突:
    你原来的代码中在内部重新定义了jsonObject,这会覆盖外部的变量,建议改用不同的名称(比如上面的topObj、userObj),提高代码可读性。

  3. 处理null字段:
    对于返回值可能为null的字段(比如userAccountType、userAddress),使用optString()方法比getString()更安全,它可以在字段不存在或为null时返回指定的默认值,避免抛出异常。

内容的提问来源于stack exchange,提问作者Apple Appala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:01:17