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

Android Retrofit2+Moshi解析无键根JSON数组报错排查

问题原因

这个报错的核心是Moshi的类型判定逻辑和你声明的返回类型不匹配:

  • 你自定义的UserRepoListResponse虽然继承了ArrayList<UserRepoListResponseItem>,但Moshi默认不会把继承集合类的自定义类型识别为集合,依然会按普通实体类处理,对应期望解析的JSON结构是{}包裹的对象,要求响应起始字符为{。
  • 实际GitHub接口返回的根节点是[]包裹的数组,响应起始字符为[,和Moshi的解析预期不符,直接抛出解析错误。
修复方案

按实现成本从低到高推荐:

  • 最优方案:删掉自定义的集合继承类,接口直接返回标准集合类型。Moshi对标准库的List类型有内置适配,不需要额外配置就能直接解析根数组响应,修改接口声明即可:
    interface GithubApi {
        @GET("users/{login}/repos")
        fun getUserRepos(@Path("login") login: String): Call<List<UserRepoListResponseItem>>
        // 如果用协程的话写挂起函数即可:
        // suspend fun getUserRepos(@Path("login") login: String): List<UserRepoListResponseItem>
    }
    
    如果需要做类型语义区分,在Kotlin里直接用类型别名即可,不会影响解析逻辑:
    typealias UserRepoListResponse = List<UserRepoListResponseItem>
    
  • 备选方案:如果一定要保留继承ArrayList的自定义类(比如要在类里加自定义业务方法、扩展字段),需要单独为这个类写一个Moshi的JsonAdapter,手动实现数组到自定义集合实例的转换,再把适配器注册到初始化的Moshi实例里。这个方案需要写额外的适配代码,非必要不选。

你之前配置的KotlinJsonAdapterFactory和MoshiConverterFactory都是正确的,不需要调整这部分初始化逻辑,问题和基础配置无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:24:16