如何修复改造错误java.lang.IllegalStateException Android

时间:2019-06-18 14:19:34

标签: android kotlin retrofit retrofit2

我已经解析了此链接中的数据

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

但是我得到了错误

E / on失败::改装错误java.lang.IllegalStateException:预期为BEGIN_ARRAY但在行1第2列路径$ BEGIN_OBJECT中

下面是我完成的代码。

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 :(得分:0)

该错误表明传入的JSON以{开头,而不是以[开头,这意味着它是一个对象,而不是对象数组。

因此,您应该拥有一个包含Contact数组的类,以使该调用成功。

一个小提示:由于您正在使用GSON,因此您的模型类将需要在变量上方实现@SerializedName(string)注释。