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

Android Volley解析JSON报错:No value for BalExDto 求助

问题分析与解决方案

哦,我一眼就看出问题所在了!你抛出的JSONException是因为你没有正确遍历返回JSON的嵌套层级,直接从根对象里找BalExDto肯定找不到呀。

先帮你理清楚返回JSON的完整层级结构:

{
  "QueryAcctBalResponse": {
    "BalExDtoList": {
      "BalExDto": [
        { "BalID": "xxxx", ..., "AcctResName": "xxxx", ... },
        { "BalID": "yyyy", ..., "AcctResName": "yyyy", ... }
      ]
    }
  }
}

你需要逐层解析,不能跳过中间的嵌套对象:

  1. 先从根response里获取QueryAcctBalResponse对象
  2. 再从这个对象里获取BalExDtoList对象
  3. 最后从BalExDtoList里拿到BalExDto数组

修正后的代码

JsonObjectRequest sq = new JsonObjectRequest(Request.Method.POST, balanceUrl, request, 
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                // 第一步:获取外层的QueryAcctBalResponse对象
                JSONObject queryResponse = response.getJSONObject("QueryAcctBalResponse");
                // 第二步:获取BalExDtoList对象
                JSONObject balListObj = queryResponse.getJSONObject("BalExDtoList");
                // 第三步:拿到BalExDto数组
                JSONArray jsonArray = balListObj.getJSONArray("BalExDto");
                
                for (int i = 0; i < jsonArray.length(); i++){
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    // 现在可以正常获取AcctResName了
                    Toast.makeText(CheckBalance.this, jsonObject.getString("AcctResName"), Toast.LENGTH_LONG).show();
                }
                pd.hide();
            } catch (JSONException e) {
                e.printStackTrace();
                // 可以在这里加个Toast提示解析失败,更友好
                Toast.makeText(CheckBalance.this, "账户余额解析失败", Toast.LENGTH_SHORT).show();
            }
            Log.d("Response", "Response_TAG: "+response);
        }
    },
    // 别忘了加上错误监听器哦,处理请求失败的情况
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            pd.hide();
            Toast.makeText(CheckBalance.this, "请求失败", Toast.LENGTH_SHORT).show();
            error.printStackTrace();
        }
    });

额外小建议

为了让代码更健壮,你可以使用optJSONObject和optJSONArray代替getJSONObject/getJSONArray,这样如果某个字段不存在时不会直接抛出异常,而是返回null,你可以提前做判断:

JSONObject queryResponse = response.optJSONObject("QueryAcctBalResponse");
if(queryResponse != null){
    JSONObject balListObj = queryResponse.optJSONObject("BalExDtoList");
    if(balListObj != null){
        JSONArray jsonArray = balListObj.optJSONArray("BalExDto");
        if(jsonArray != null && jsonArray.length() > 0){
            // 继续解析逻辑
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:01:32