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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:06:27