Android解决API返回对象而非数组的解析错误问题
问题解决:适配DuckDuckGo API返回的单个JSON对象
问题原因
DuckDuckGo API返回的是单个JSON对象,但当前代码接口声明期望接收List<GetAnyResponse>类型,导致解析时抛出「Expected BEGIN_ARRAY but was BEGIN_OBJECT at path $」错误。
修复步骤
1. 创建顶层数据类匹配API返回结构
先定义对应API完整返回结构的数据类,API返回的对象中核心列表字段为RelatedTopics,对应你需要的GetAnyResponse集合:
data class DuckDuckGoResponse( val RelatedTopics: List<GetAnyResponse> // 可根据API实际返回字段,按需添加其他属性 )
2. 修改API接口的返回类型
将AnywhereAPI的返回类型从Response<List<GetAnyResponse>>改为Response<DuckDuckGoResponse>,同时清理冗余的Query参数(原q参数中重复携带了format=json):
@Singleton interface AnywhereAPI { @GET(".") suspend fun getAnyInfo( @Query("q") query: String = "the+wire+characters", @Query("format") format: String = "json" ): Response<DuckDuckGoResponse> }
3. 调整Repository的数据处理逻辑
在AnywhereRepository中,从API响应的顶层对象里取出目标列表,再做实体映射:
class AnywhereRepository @Inject constructor( private val api: AnywhereAPI, private val anywhereDao: AnywhereDao ){ val feeds: Flow<List<AnywhereListEntity>> get() = anywhereDao.getInfo() suspend fun anywhereInfo(): List<AnywhereListEntity>? { val request = api.getAnyInfo() if (request.isSuccessful){ // 从顶层对象中提取RelatedTopics列表 val anyItems = request.body()!!.RelatedTopics.map { AnywhereMapper.buildFrom(it) } anywhereDao.insertInfo(*anyItems.toTypedArray()) return anyItems } return null } }
4. ViewModel无需修改
ViewModel的调用逻辑保持原样,异常处理可保留以捕获潜在问题。
内容的提问来源于stack exchange,提问作者OEThe11
相关产品推荐
相关产品推荐

