RxJava+Retrofit调用API报错: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

