Android Retrofit2+Moshi解析无键根JSON数组报错排查
问题原因
这个报错的核心是Moshi的类型判定逻辑和你声明的返回类型不匹配:
- 你自定义的
UserRepoListResponse虽然继承了ArrayList<UserRepoListResponseItem>,但Moshi默认不会把继承集合类的自定义类型识别为集合,依然会按普通实体类处理,对应期望解析的JSON结构是{}包裹的对象,要求响应起始字符为{。 - 实际GitHub接口返回的根节点是
[]包裹的数组,响应起始字符为[,和Moshi的解析预期不符,直接抛出解析错误。
修复方案
按实现成本从低到高推荐:
- 最优方案:删掉自定义的集合继承类,接口直接返回标准集合类型。Moshi对标准库的
List类型有内置适配,不需要额外配置就能直接解析根数组响应,修改接口声明即可:
如果需要做类型语义区分,在Kotlin里直接用类型别名即可,不会影响解析逻辑:interface GithubApi { @GET("users/{login}/repos") fun getUserRepos(@Path("login") login: String): Call<List<UserRepoListResponseItem>> // 如果用协程的话写挂起函数即可: // suspend fun getUserRepos(@Path("login") login: String): List<UserRepoListResponseItem> }typealias UserRepoListResponse = List<UserRepoListResponseItem> - 备选方案:如果一定要保留继承
ArrayList的自定义类(比如要在类里加自定义业务方法、扩展字段),需要单独为这个类写一个Moshi的JsonAdapter,手动实现数组到自定义集合实例的转换,再把适配器注册到初始化的Moshi实例里。这个方案需要写额外的适配代码,非必要不选。
你之前配置的
KotlinJsonAdapterFactory和MoshiConverterFactory都是正确的,不需要调整这部分初始化逻辑,问题和基础配置无关。
内容的提问来源于stack exchange,提问作者foseja
相关产品推荐
相关产品推荐

