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

使用Retrofit开发新闻应用时报Expected BEGIN_OBJECT but was BEGIN_ARRAY错误

问题原因

你的报错本质是Gson解析类型不匹配:你代码中声明接口返回的是News对象(对应JSON结构是最外层用{}包裹的对象),但实际你请求的API返回的最外层是用[]包裹的数组,所以解析时触发类型不匹配异常。

修改方案

1. 调整Retrofit接口定义

你不需要额外的News包装类,直接将接口返回值声明为文章列表即可:

import retrofit2.Call
import retrofit2.http.GET

interface CallableInterface {
    @GET("/api/v1/dev_tracker?page=1&source=reddit")
    fun getNews(): Call<List<Article>>
}

2. 优化Article数据类(可选,推荐)

用Kotlin的data class承载数据更合适:

data class Article(
    var content: String = "",
    var language: String = "",
    var title: String = ""
)

3. 修改Activity中的回调逻辑

把回调的泛型从News改成List<Article>,对应调整响应解析逻辑,增加空判断避免崩溃:

fun loadNews() {
    val progress: ProgressBar = findViewById(R.id.pb)
    val retrofit = Retrofit
        .Builder()
        .baseUrl("https://newworldfans.com")
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    val callable = retrofit.create(CallableInterface::class.java)
    val getNews = callable.getNews()
    getNews.enqueue(object : Callback<List<Article>> {
        override fun onResponse(call: Call<List<Article>>, response: Response<List<Article>>) {
            progress.visibility = View.GONE
            val articleList = response.body()
            if (!articleList.isNullOrEmpty()) {
                Toast.makeText(this@DrawerActivity,
                   "${articleList[0].content}", Toast.LENGTH_SHORT).show()
            }
            Log.d("json", "Success"  )
        }

        override fun onFailure(call: Call<List<Article>>, t: Throwable) {
            progress.visibility = View.GONE
            Toast.makeText(this@DrawerActivity, "Failed", Toast.LENGTH_SHORT).show()
            Log.d("json", "${t.localizedMessage} ")
        }
    })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:39:01