Kotlin Retrofit协程报错:Expected BEGIN_ARRAY but was BEGIN_OBJECT求助
问题解决:Expected BEGIN_ARRAY but was BEGIN_OBJECT 解析异常
异常原因
你的代码定义API接口直接返回List<Result>,但实际API返回的是包裹数组的JSON对象(比如多数分页接口会返回{"info": {...}, "results": [...]}这类结构)。JSON解析库(Gson/Moshi等)期望接收数组格式([]),但实际收到的是对象格式({}),因此抛出该解析异常。
修复步骤
1. 创建匹配API返回结构的顶层数据类
根据API真实返回的JSON结构,定义对应的顶层数据类(以常见的分页接口为例,可根据实际返回调整字段):
data class CharacterResponse( val info: Info?, // 可选字段,根据API实际返回决定是否保留 val results: List<Result>? ) // 若API包含info字段,补充该类(不需要可删除) data class Info( val count: Int?, val pages: Int?, val next: String?, val prev: String? )
2. 修改API接口定义
将接口返回类型从List<Result>改为刚创建的顶层数据类:
interface RMApiService { @GET(Constants.END_POINT) suspend fun getCharacters(): CharacterResponse }
3. 更新Repository逻辑
从顶层响应对象中提取出results列表:
class RMRepositoryImpl @Inject constructor(private val api: RMApiService):RMRepository{ override suspend fun getCharacters(): List<Result> { val apiResponse = api.getCharacters() // 若results为null,返回空列表避免后续空指针 return apiResponse.results ?: emptyList() } }
验证
修改完成后重新请求API,解析库会正确匹配外层JSON对象,从中提取results数组进行解析,即可解决该异常。
内容的提问来源于stack exchange,提问作者Victor Escalante
相关产品推荐
相关产品推荐

