Android中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

