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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:00:02