使用RealmList与Moshi时触发IllegalArgumentException错误求助
解决RealmList与Moshi结合时的JsonAdapter注册错误
嘿,这个问题我之前踩过坑!其实就是Moshi默认没法识别Realm自定义的RealmList类型,所以得给它加个专属的JsonAdapter才行。你已经找到对应的Issue了,那咱们把剩下的步骤补全:
1. 确保你的RealmListAdapter代码正确
你复制的RealmListAdapter可以用这个更严谨的版本(避免类型转换警告):
public class RealmListAdapter<T> extends JsonAdapter<RealmList<T>> { public static final Factory FACTORY = new Factory() { @Override public JsonAdapter<?> create(Type type, Set<? extends Annotation> annotations, Moshi moshi) { if (!annotations.isEmpty()) return null; if (type instanceof ParameterizedType) { Type rawType = ((ParameterizedType) type).getRawType(); if (rawType == RealmList.class) { Type elementType = ((ParameterizedType) type).getActualTypeArguments()[0]; @SuppressWarnings("unchecked") JsonAdapter<T> elementAdapter = (JsonAdapter<T>) moshi.adapter(elementType); return new RealmListAdapter<>(elementAdapter); } } return null; } }; private final JsonAdapter<T> elementAdapter; public RealmListAdapter(JsonAdapter<T> elementAdapter) { this.elementAdapter = elementAdapter; } @Override public RealmList<T> fromJson(JsonReader reader) throws IOException { RealmList<T> list = new RealmList<>(); reader.beginArray(); while (reader.hasNext()) { list.add(elementAdapter.fromJson(reader)); } reader.endArray(); return list; } @Override public void toJson(JsonWriter writer, RealmList<T> value) throws IOException { writer.beginArray(); for (T element : value) { elementAdapter.toJson(writer, element); } writer.endArray(); } }
2. 把Adapter注册到Moshi实例中
创建Moshi的时候,必须把RealmListAdapter.FACTORY加入配置,这样Moshi才知道如何解析RealmList类型:
Moshi moshi = new Moshi.Builder() .add(RealmListAdapter.FACTORY) // 如果MenuGroupModel里还有Realm自定义类型(比如RealmString),记得同步注册对应Adapter .build();
3. (可选)和Retrofit搭配时的配置
如果你是和Retrofit一起使用,要把这个自定义Moshi实例传给ConverterFactory:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的接口基础地址") .addConverterFactory(MoshiConverterFactory.create(moshi)) .build();
额外注意事项
- 确保
MenuGroupModel也正确实现了RealmModel接口,无语法错误; - 如果
MenuGroupModel包含其他Realm专属类型(如RealmString、RealmInteger),同样需要为这些类型编写JsonAdapter并注册到Moshi; - 若使用Realm最新版本,注意检查Adapter代码是否兼容最新API。
内容的提问来源于stack exchange,提问作者Asim
相关产品推荐
相关产品推荐

