You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJava+Retrofit调用API报错:Expected BEGIN_ARRAY but was BEGIN_OBJECT原因分析

错误分析:java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT

这个错误的核心是序列化数据类和API返回的JSON结构不匹配——代码里期望接收数组格式([]),但实际API返回的是对象格式({}),以下是结合你提供的代码模块的具体排查方向:

  • API返回JSON与根解析类型不匹配
    检查API返回的JSON根结构:如果返回的是包裹数组的对象(比如{"data": [...], "code":200}),但你却直接用数组类型(比如List<FacilitiesData>)去解析整个响应,就会触发该错误。

  • FacilityApi接口定义错误
    查看接口方法的返回值:如果接口写的是Observable<List<FacilitiesData>>,但实际API返回的是包含数组的对象,必须改成对应根对象的Observable类型(比如Observable<FacilitiesResponse>,其中FacilitiesResponse是包含数组字段的根数据类)。

  • FacilitiesData数据类结构错误
    若FacilitiesData是数组中的单个条目类,但你把它作为整个响应的解析目标,而API返回的是包裹这个列表的对象,就会出现解析冲突。比如API返回{"facilities": [{"id":1}, ...]},你需要定义一个包含val facilities: List<FacilitiesData>的根数据类,而不是直接解析成List<FacilitiesData>。

  • Retrofit转换器配置问题(概率较低)
    如果你自定义了解析转换器,或者Gson/Moshi等转换器的配置有误,可能导致解析时错误识别结构,但这种情况少见,优先排查前三点。

举个匹配的例子:
假设API返回JSON:

{
"code": 200,
"data": [
{"id": 1, "name": "Facility A"},
{"id": 2, "name": "Facility B"}
]
}

对应的数据类应该是:

data class FacilitiesResponse(
    val code: Int,
    val data: List<FacilitiesData>
)

data class FacilitiesData(
    val id: Int,
    val name: String
)

API接口定义:

interface FacilityApi {
    @GET("facilities")
    fun getFacilities(): Observable<FacilitiesResponse>
}

内容的提问来源于stack exchange,提问作者Dishita Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:10:17