首页 > 解决方案 > 如何在 Kotlin 中将 API BEGIN_ARRAY 更改为 BEGIN_OBJECT?

问题描述

这是我的服务:

class NewsAPIService {
private val BASE_URL = "http://newsapi.org/v2/"
private val api = Retrofit.Builder().baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build()
    .create(NewsAPI::class.java)

fun getData():Single<List<news58>>{
    return api.getNews()
}}

这是我的界面:

interface NewsAPI {
@GET("top-headlines?category=sports&apiKey=42862811f4c94e82988aaa326dad8f4c")
fun getNews():Single<List<news58>>
}

这是我的viewModel

private fun getDataFromAPI(){
    newsLoading.value = true
    disposible.add(
        newsApiService.getData()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableSingleObserver<List<news58>>(){
                override fun onSuccess(t: List<news58>) {
                    getNews.value = t
                newsLoading.value = false
                    newsError.value = false

                }

                override fun onError(e: Throwable) {
                    newsLoading.value = false
                    newsError.value = true
                 e.printStackTrace()
                }}))}

当我尝试下载数据时,出现此错误:

2020-04-07 12:48:20.148 16738-16738/com.msamil.newspaper4 W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
2020-04-07 12:48:20.148 16738-16738/com.msamil.newspaper4 W/System.err:     at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)

我该如何解决?这是一个新的应用程序。我正在努力学习它,但它不是那样工作的。

标签: androidkotlinretrofit

解决方案


这个问题只是因为您从 API 响应中获取列表,但是您的响应只是向您发送了 JSONObject,而不是列表。

所以,在你的情况下,你可能必须像下面这样使用

fun getData():Single<ews58>{
    return api.getNews()
}}

在您的界面中

interface NewsAPI {
@GET("top-headlines?category=sports&apiKey=42862811f4c94e82988aaa326dad8f4c")
fun getNews():Single<news58>
}

更新

视图模型

private fun getDataFromAPI(){
    newsLoading.value = true
    disposible.add(
        newsApiService.getData()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableSingleObserver<news58>(){
                override fun onSuccess(t: news58) {
                   // your code

                }

                override fun onError(e: Throwable) {
                    newsLoading.value = false
                    newsError.value = true
                 e.printStackTrace()
                }}))}

推荐阅读