使用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é
相关产品推荐
相关产品推荐

