Retrofit+RxJava报错:无法为java.util.List<Model>创建转换器
解决Retrofit+RxJava无法创建List转换器的问题
看起来你遇到的IllegalArgumentException核心问题是Retrofit的Gson转换器无法将GitHub API返回的JSON数据映射到你的List<SearchRequestModel>对象上,大概率是你的SearchRequestModel结构和API返回的响应不匹配导致的,我来一步步帮你排查解决:
一、先明确错误根源
这个错误提示说明Gson在尝试将API返回的JSON数组转换成List<SearchRequestModel>时失败了,常见原因包括:
SearchRequestModel的字段与GitHub/users/{user}/starred接口返回的JSON结构不匹配(字段名不对、类型错误)- 误用了请求类型的Model作为响应接收Model(从你的Model名字
SearchRequestModel来看,这个可能性很高) - Gson配置或依赖的小问题(不过你的配置看起来没问题)
二、具体排查步骤
1. 核对GitHub API的返回结构
先打开浏览器或者用调试工具访问https://api.github.com/users/octocat/starred,看看返回的JSON结构,每个仓库对象大概是这样的:
[ { "id": 1296269, "name": "Hello-World", "full_name": "octocat/Hello-World", "owner": { "login": "octocat", "avatar_url": "https://avatars.githubusercontent.com/u/583231?v=4" }, "description": "My first repository on GitHub!" // 更多字段... } ]
2. 检查你的SearchRequestModel实现
对比上面的JSON结构,确保你的Model字段和类型完全对应:
- 比如JSON里的
id是数字类型,你的Model里不能写成String id - 如果你的Model字段是驼峰命名(比如
fullName),你的Gson配置已经设置了LOWER_CASE_WITH_UNDERSCORES,会自动映射到full_name,这部分没问题;如果有特殊字段,也可以手动加@SerializedName注解明确映射:
特别注意:如果你的public class SearchRequestModel { // 建议改名为StarredRepoModel更清晰 private long id; private String name; @SerializedName("full_name") // 可选,因为命名策略已经处理,但加了更明确 private String fullName; private Owner owner; private String description; // 内部类Owner对应JSON里的owner对象 public static class Owner { private String login; @SerializedName("avatar_url") private String avatarUrl; // 别忘了添加getter/setter,或者用public字段,Gson都能处理 } // 添加所有需要的字段的getter/setter }SearchRequestModel是用来封装请求参数的(比如搜索请求的参数),那肯定不能用来接收响应,这时候你需要新建一个专门的响应Model。
3. 临时调试确认问题
如果还是找不到问题,可以临时修改你的接口返回类型,直接接收JSON对象,看看返回的数据:
@GET("users/{user}/starred") Observable<List<JsonObject>> getStarredRepositories(@Path("user") String username);
然后在subscribe里打印JsonObject:
.subscribe(new Consumer<List<JsonObject>>() { @Override public void accept(List<JsonObject> jsonObjects) throws Exception { Log.d("RepoData", jsonObjects.toString()); // 这里打印出来的结构就能和你的Model对比,找到不匹配的地方 } }, ...)
4. 检查依赖和配置
你的依赖版本都是兼容的(Retrofit 2.4.0对应RxJava2 adapter和Gson converter 2.4.0),Gson的配置也没问题,所以这部分大概率不是问题,但可以确认一下有没有漏加converter-gson依赖(你已经加了,没问题)。
三、总结
最可能的问题就是SearchRequestModel和API响应结构不匹配,按照上面的步骤核对调整后,应该就能解决这个转换器创建失败的问题了。
内容的提问来源于stack exchange,提问作者sodiqOladeni
相关产品推荐
相关产品推荐

