Android Studio中Retrofit2解析JSON报错:预期字符串却为BEGIN_ARRAY
解决Retrofit2多表JSON数据获取的两个报错问题
我来帮你一步步拆解并解决这两个棘手的问题!
1. 先处理java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY错误
这个报错的核心原因很明确:你的ResponseModel类中定义的pesan字段是String类型,但服务器返回的JSON里,$.pesan实际上是一个数组(比如["数据获取成功"]这种格式),Gson解析时类型不匹配就会抛出这个异常。
解决步骤:
- 先确认服务器返回的完整JSON结构:你可以通过Retrofit的日志拦截器(HttpLoggingInterceptor)打印响应体,或者在回调里直接输出
response.body().toString(),看看pesan到底是字符串还是数组。 - 根据实际结构修改ResponseModel:
- 如果服务器返回的
pesan确实是数组,把字段类型改成List<String>:public class ResponseModel { String kode; List<String> pesan; // 这里从String改成List<String> List<QuestionModel> result_question; // 记得添加getter/setter,或者用@SerializedName注解匹配JSON字段名(如果字段名不一致的话) } - 如果后端可以调整,也可以让他们把
pesan改成字符串格式(比如"数据获取成功"),这样你就不用改ResponseModel了。
- 如果服务器返回的
2. 再解决No adapter attached; skipping layout错误
这个错误通常和RecyclerView的初始化逻辑有关,本质是RecyclerView在渲染时没有绑定任何adapter,可能是因为数据加载失败后adapter一直处于null状态,或者你只在请求成功时才设置adapter。
解决步骤:
- 提前初始化空adapter:在Activity/Fragment的
onCreate或onViewCreated阶段,就给RecyclerView设置一个空的adapter(哪怕数据源是空列表),比如:// 初始化RecyclerView和空adapter RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); List<QuestionModel> emptyList = new ArrayList<>(); QuestionAdapter adapter = new QuestionAdapter(emptyList); recyclerView.setAdapter(adapter); - 请求成功后更新adapter数据:当Retrofit拿到
result_question数据后,直接更新adapter的数据源并通知刷新:// Retrofit成功回调里 adapter.updateData(response.body().getResult_question()); adapter.notifyDataSetChanged(); - 处理请求失败的情况:在
onFailure回调里也要做相应处理(比如显示错误Toast),避免用户看不到任何反馈,同时确保adapter始终处于可用状态。
另外还要注意:检查你的QuestionModel类是否和服务器返回的result_question数组里的每个对象结构完全匹配,字段名、类型都要对应,否则也会导致解析失败,间接引发adapter问题。
内容的提问来源于stack exchange,提问作者ASHafizullah
相关产品推荐
相关产品推荐

