如何解决Retrofit请求中的java.lang.IllegalStateException解析错误?
错误分析与解决方案
错误原因
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY 本质是接口返回JSON数组格式(用[]包裹),但你的代码用单个DataModalItem对象接收解析。从接口路径/jokes/random/25能看出,接口会返回25条笑话组成的数组,而非单条笑话对象。
具体修改步骤
1. 修改接口定义(apiService.kt)
将返回类型从单个对象改为数组列表:
@GET("/jokes/random/25") fun getData(): Call<List<DataModalItem>>
2. 修改Activity中的回调逻辑(MainActivity.kt)
同步更新回调的泛型类型,并处理数组数据:
fun getData() { apiCall().apiService.getData() .enqueue(object : Callback<List<DataModalItem>> { override fun onResponse( call: Call<List<DataModalItem>>, response: Response<List<DataModalItem>> ) { // 遍历数组,处理每条笑话数据 response.body()?.forEach { joke -> Log.e("CHECK_RES", "onResponse: 笑话包袱: ${joke.punchline}") } } override fun onFailure(call: Call<List<DataModalItem>>, t: Throwable) { Log.e("CHECK_RES", "Error: ${t.localizedMessage}") Toast.makeText(this@MainActivity, "Error: ${t.localizedMessage}", Toast.LENGTH_SHORT).show() } }) }
3. 确保DataModalItem类字段匹配接口返回
如果还未正确定义DataModalItem,需保证其字段与接口返回的单条笑话结构一致:
data class DataModalItem( val id: Int, val type: String, val setup: String, val punchline: String )
内容的提问来源于stack exchange,提问作者Kruti Devani
相关产品推荐
相关产品推荐

