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

Android中Volley获取的JSON无法解析到ArrayList问题求助

排查Volley解析JSON到ArrayList失败的问题

我来帮你梳理下可能导致JSON响应无法解析到numbersList的几个关键点,结合你的代码和JSON结构逐一分析:


1. 先确认Adapter与numbersList的引用一致性

这是最常见的坑:如果你的RecyclerView/ListView Adapter没有持有同一个numbersList引用,哪怕你在onResponse里更新了列表,UI也不会有变化。

举个例子,你的Adapter构造方法应该是这样的(确保直接传入并持有原列表引用):

public class NumbersAdapter extends RecyclerView.Adapter<NumbersAdapter.ViewHolder> {
    private ArrayList<TrigNumbersModel> mNumbersList;

    // 直接接收外部传入的列表引用,而不是在内部new新的列表
    public NumbersAdapter(ArrayList<TrigNumbersModel> numbersList) {
        this.mNumbersList = numbersList;
    }

    // ...其他重写方法(比如onBindViewHolder里使用mNumbersList的数据)
}

如果你的Adapter是通过new ArrayList<>(numbersList)这种方式初始化的,那后续numbersList的更新完全不会同步到Adapter里,自然看不到数据。

2. 检查异步请求与Adapter的初始化顺序

Volley的网络请求是异步执行的,如果你在Adapter还没初始化、或者还没绑定到RecyclerView的时候就调用了fetchJson(),即使numbersList被正确填充,adapter.notifyDataSetChanged()也不会生效。

建议调整顺序:先初始化Adapter并绑定到UI组件,再调用fetchJson();或者在onResponse里先判断Adapter是否不为null,再执行刷新:

// 在onResponse里加个判断
if (adapter != null) {
    adapter.notifyDataSetChanged();
}

3. 通过日志确认JSON解析是否真的执行了

你代码里加了outter(jo.toString())和outter(jo.getString("phone"))这两行日志,先去Logcat里查看:

  • 如果这两行日志没有打印:说明JSONArray jsonArray = new JSONArray(response);这一步抛出了JSONException,去看异常栈信息——大概率是服务器返回的响应不是纯JSON数组(比如可能带了外层包装,像{"code":200,"data":[...]}),或者响应格式有问题。
  • 如果这两行日志正常打印了phone的值:那问题肯定出在numbersList的引用上(比如你在其他地方重新new了一个numbersList,和Adapter持有的不是同一个对象)。

4. 实体类的小优化(非必选,但能避免后续坑)

你实体类里的@SerializedName("triggerNumber")注解目前是无效的,因为你是手动解析JSON字段,没有用到Gson这类序列化库。如果之后打算用自动解析,记得把注解改成@SerializedName("phone"),和JSON里的字段名对应上。

5. 改用GsonRequest简化解析(推荐)

手动解析JSON很容易出错,用Volley的GsonRequest可以自动把JSON数组转换成ArrayList<TrigNumbersModel>,代码更简洁也更可靠:

首先确保添加了Gson依赖:

implementation 'com.google.code.gson:gson:2.10.1'

然后修改fetchJson方法:

public void fetchJson(final String subID){ 
    final RequestQueue requestQueue = Volley.newRequestQueue(TrigNumbers.this); 
    // 用GsonRequest直接解析成ArrayList
    GsonRequest<ArrayList<TrigNumbersModel>> gsonRequest = new GsonRequest<>(
        Request.Method.GET, 
        URL_STRING + "?sub_id=" + subID, 
        // 告诉Gson要解析成ArrayList<TrigNumbersModel>类型
        new TypeToken<ArrayList<TrigNumbersModel>>(){}.getType(),
        new Response.Listener<ArrayList<TrigNumbersModel>>() {
            @Override
            public void onResponse(ArrayList<TrigNumbersModel> response) {
                numbersList.clear();
                numbersList.addAll(response);
                if (adapter != null) {
                    adapter.notifyDataSetChanged();
                }
            }
        }, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                outter("" + error);
            }
        }
    );
    requestQueue.add(gsonRequest);
}

同时修改实体类的注解:

public class TrigNumbersModel { 
    @SerializedName("phone") // 和JSON里的字段名对应
    String trigNo; 

    public TrigNumbersModel() {}

    public TrigNumbersModel(String trigNo) {
        this.trigNo = trigNo;
    }

    public String getTrigNo() {
        return trigNo;
    }

    public void setTrigNo(String trigNo) {
        this.trigNo = trigNo;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:54