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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:39:57