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(); } }
核心注意事项
区分JSON对象和数组:
- 用
{}包裹的是JSON对象,对应代码中的JSONObject - 用
[]包裹的是JSON数组,对应代码中的JSONArray
你的返回数据里user是一个对象,不是数组,所以直接用getJSONObject("user")获取。
- 用
避免变量名冲突:
你原来的代码中在内部重新定义了jsonObject,这会覆盖外部的变量,建议改用不同的名称(比如上面的topObj、userObj),提高代码可读性。处理null字段:
对于返回值可能为null的字段(比如userAccountType、userAddress),使用optString()方法比getString()更安全,它可以在字段不存在或为null时返回指定的默认值,避免抛出异常。
内容的提问来源于stack exchange,提问作者Apple Appala
相关产品推荐
相关产品推荐

