求助:修改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
相关产品推荐
相关产品推荐

