Как исправить ошибку errorjava.lang.IllegalStateException для Android - PullRequest
0 голосов
/ 18 июня 2019

У меня есть парсинг данных по этой ссылке

https://api.androidhive.info/contacts/

Но я получаю ошибку как

E / on Failure :: retrofit errorjava.lang.IllegalStateException: ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1, путь 2 столбца $

Ниже приведен код, который я сделал.

class RetrofitService {
    val liveUserResponse:MutableLiveData<List<ContactBase>> = MutableLiveData()

    companion object Factory {
        var gson = GsonBuilder().setLenient().create()
        fun create(): ApiInterface {
            Log.e("retrofit","create")

            val retrofit = Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl("https://api.androidhive.info/")
                .build()

            return retrofit.create(ApiInterface::class.java)
        }
    }
    fun loadContactsData(): MutableLiveData<List<ContactBase>>? {

        Log.e("loadAndroidData","yes")

        val retrofitCall  = create().getContacts()

        retrofitCall.enqueue(object : Callback<List<ContactBase>> {
            override fun onFailure(call: Call<List<ContactBase>>, t: Throwable?) {
                Log.e("on Failure :", "retrofit error"+t)
                Log.e("on Failure :", "retrofit error"+call)
            }

            override fun onResponse(call: Call<List<ContactBase>>, response: retrofit2.Response<List<ContactBase>>) {
                val list  = response.body()
                for (i in list.orEmpty()){
                    Log.e("on response 1:", ""+i)
                }
                liveUserResponse.value = list
                Log.e("hasActiveObservers 1", liveUserResponse.hasActiveObservers().toString()+" check")
                Log.e("on response 2 :", liveUserResponse.toString()+" check")

            }

        })

        return liveUserResponse
    }
}

Но это всегда будет в состоянии отказа.

data class ContactBase (val contacts : List<Contacts>)

data class Contacts (

    val id : String,
    val name : String,
    val email : String,
    val address : String,
    val gender : String,
    val phone : Phone
)

 data class Phone (

    val mobile : String,
    val home : String,
    val office : String
)

 interface ApiInterface{
    @GET("contacts/")
    fun getContacts(): Call<List<ContactBase>>
}



class AndroidViewModel:ViewModel(){
    private val retrofitService = RetrofitService()

    fun getContactsData(): MutableLiveData<List<ContactBase>>?{
        return  retrofitService.loadContactsData()
    }
}

Я тоже проверил URL и класс pojo. Но это всегда идет в случае отказа в модернизации.

1 Ответ

0 голосов
/ 18 июня 2019

Ошибка говорит о том, что входящий JSON начинается с {, а не с [, что означает, что это объект, а не массив объектов.

Итак, у вас должен быть класс с массивом Contact, чтобы сделать этот вызов успешным.

Небольшое замечание: так как вы используете GSON, ваши классы моделей нуждаются в реализации аннотации @SerializedName(string) над переменными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...