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

求助:修改Android Studio中JSON对象转数组的代码(附Volley错误)

解决JSON对象转数组的Volley解析错误

先看你的Logcat错误,是ParseError引发的JSONException,问题核心很明确:你把根层级的JSON对象当成JSON数组来解析了。返回的完整JSON结构是这样的:

{"data":[{"errand":"Shopping","charges":"500"},{"errand":"House Assistance","charges":"7000"},{"errand":"Pick - Up","charges":"2500"}],"success":1,"message":" 0 records found"}

根节点是一个JSON对象,里面的data字段才是你需要的数组。下面给你修正后的代码方案:

步骤1:定义数据模型类(可选但推荐)

先创建一个Errand类来对应每个数据项,方便后续操作:

public class Errand {
    private String errand;
    private String charges;

    public String getErrand() {
        return errand;
    }

    public void setErrand(String errand) {
        this.errand = errand;
    }

    public String getCharges() {
        return charges;
    }

    public void setCharges(String charges) {
        this.charges = charges;
    }
}

步骤2:修正Volley的JSON解析逻辑

在你的Volley请求回调里,先解析根JSON对象,再取出data数组进行遍历处理:

StringRequest stringRequest = new StringRequest(Request.Method.GET, YOUR_API_URL,
        response -> {
            try {
                // 先解析根层级的JSON对象
                JSONObject rootObject = new JSONObject(response);
                // 先判断请求状态(根据接口返回的success字段)
                int success = rootObject.getInt("success");
                if (success == 1) {
                    // 取出真正需要的data数组
                    JSONArray dataArray = rootObject.getJSONArray("data");
                    List<Errand> errandList = new ArrayList<>();
                    // 遍历数组,把每个JSON对象转成Errand实例
                    for (int i = 0; i < dataArray.length(); i++) {
                        JSONObject errandObj = dataArray.getJSONObject(i);
                        Errand errand = new Errand();
                        errand.setErrand(errandObj.getString("errand"));
                        errand.setCharges(errandObj.getString("charges"));
                        errandList.add(errand);
                    }
                    // 到这里errandList就是你需要的数组列表了,可用于更新UI等操作
                } else {
                    String message = rootObject.getString("message");
                    // 处理请求失败的情况,比如给用户提示
                }
            } catch (JSONException e) {
                e.printStackTrace();
                // 处理解析异常,比如弹出提示告知用户数据加载失败
            }
        },
        error -> {
            // 处理网络请求错误,比如无网络、接口不可达等
            error.printStackTrace();
        });

// 将请求加入Volley请求队列
Volley.newRequestQueue(this).add(stringRequest);

几个要注意的细节

  • 绝对不能直接把整个接口响应转成JSONArray,根节点是JSONObject,必须先解析它
  • 注意JSON字段名的大小写,代码里的getString参数要和接口返回的字段完全一致(比如errand不能写成Errand)
  • 如果charges是数值类型,可以改用getInt("charges")或getDouble("charges"),根据实际业务需求调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:11:51