Как изменить API BEGIN_ARRAY на BEGIN_OBJECT в Kotlin? - PullRequest
0 голосов
/ 07 апреля 2020

Это мой сервис:

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)

Как это исправить? Это новое приложение. Я пытаюсь научиться этому, но это не сработает.

1 Ответ

1 голос
/ 07 апреля 2020

Эта проблема возникает только из-за того, что вы получили List из своего ответа API, но ваш ответ только что послал вам JSONObject, а не List.

Итак, в вашем случае вам, возможно, придется использовать, как показано ниже

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

в вашем интерфейсе

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

Обновление

ViewModel

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()
                }}))}
...