Retrofit2 Android解析JSON报错:期望数组却得对象,请求代码调试协助
问题排查与解决方案
1. 核心错误原因
这个报错是因为你让Retrofit期望解析一个数组(List/Array),但目标JSON的最外层实际是一个对象,你需要的entries数组是这个外层对象里的一个字段。
2. 修正数据类结构
必须先定义一个外层数据类包裹整个JSON对象,再定义条目类对应entries里的单条数据:
外层响应类(比如NewsResponse)
data class NewsResponse( val entries: List<Entry> // 如果需要JSON里的其他字段(如featured),直接添加对应属性即可 )
新闻条目类(Entry)
根据目标JSON的字段结构定义,示例如下(按需补充字段):
data class Entry( val title: String, val date: String, val content: String, val imageUrl: String?, // 可选字段加?标记避免空指针 val link: String )
3. 修正Retrofit接口
之前你可能直接让接口返回Call<List<Entry>>,现在要改成返回外层响应类:
interface NewsApi { @GET("news.json") fun getNews(): Call<NewsResponse> }
4. 调整Fragment请求逻辑
在回调中从响应体里提取entries数组,再传给适配器:
newsApi.getNews().enqueue(object : Callback<NewsResponse> { override fun onResponse(call: Call<NewsResponse>, response: Response<NewsResponse>) { if (response.isSuccessful) { val newsList = response.body()?.entries ?: emptyList() // 给RecyclerView适配器设置数据 newsAdapter.submitList(newsList) } } override fun onFailure(call: Call<NewsResponse>, t: Throwable) { // 处理请求失败逻辑(如Toast提示) } })
5. 确认RecyclerView适配器适配性
确保适配器的数据源是List<Entry>,比如使用ListAdapter的示例:
class NewsAdapter : ListAdapter<Entry, NewsAdapter.ViewHolder>(DiffCallback()) { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(entry: Entry) { itemView.tv_title.text = entry.title itemView.tv_date.text = entry.date // 其他字段绑定逻辑 } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_news, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.bind(getItem(position)) } class DiffCallback : DiffUtil.ItemCallback<Entry>() { override fun areItemsTheSame(oldItem: Entry, newItem: Entry): Boolean { return oldItem.link == newItem.link // 用唯一标识判断条目是否相同 } override fun areContentsTheSame(oldItem: Entry, newItem: Entry): Boolean { return oldItem == newItem } } }
常见错误复盘
- 忽略JSON层级:直接请求数组类型,没考虑最外层是对象的结构
- 数据类不匹配:缺少外层包裹类,导致解析时类型不对应
- 回调逻辑错误:没有从响应体中正确提取内层的
entries数组
内容的提问来源于stack exchange,提问作者IbremMiner837
相关产品推荐
相关产品推荐

