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

Realm Kotlin中JSON转Model报错:RealmList与ArrayList类型不匹配求助

解决RealmList与ArrayList类型不匹配的问题

首先注意到错误提示里的sessionPerWeek和你代码中的weeks字段名不一致,请先检查字段名是否完全匹配——这是最常见的排查点,确认JSON中的字段和Realm模型字段名称一致,避免笔误。

如果字段名没问题,核心问题是JSON解析库(如Gson、Moshi)默认无法将ArrayList转换为Realm的RealmList,以下是两种可行的解决方式:

方式一:自定义类型转换器(以Moshi为例)

编写适配RealmList的Json适配器,让解析库识别并转换类型:

import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import io.realm.kotlin.types.RealmList

class RealmListAdapter<T>(private val elementAdapter: JsonAdapter<T>) : JsonAdapter<RealmList<T>>() {
    override fun fromJson(reader: JsonReader): RealmList<T> {
        val realmList = RealmList<T>()
        reader.beginArray()
        while (reader.hasNext()) {
            elementAdapter.fromJson(reader)?.let { realmList.add(it) }
        }
        reader.endArray()
        return realmList
    }

    override fun toJson(writer: JsonWriter, value: RealmList<T>?) {
        writer.beginArray()
        value?.forEach { elementAdapter.toJson(writer, it) }
        writer.endArray()
    }
}

然后在Realm模型的weeks字段上添加注解:

import com.squareup.moshi.JsonAdapter
import io.realm.kotlin.types.RealmList
import io.realm.kotlin.types.RealmObject
import io.realm.kotlin.ext.realmListOf
import io.realm.kotlin.annotations.PrimaryKey

open class ProgramDoc() : RealmObject {
    @PrimaryKey
    var _id: String = ""
    @JsonAdapter(RealmListAdapter::class)
    var weeks: RealmList<Int> = realmListOf()
}

如果使用Gson,可编写对应的TypeAdapter并注册到Gson实例中:

import com.google.gson.TypeAdapter
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonWriter
import io.realm.kotlin.types.RealmList

class RealmListIntAdapter : TypeAdapter<RealmList<Int>>() {
    override fun write(out: JsonWriter, value: RealmList<Int>?) {
        out.beginArray()
        value?.forEach { out.value(it) }
        out.endArray()
    }

    override fun read(`in`: JsonReader): RealmList<Int> {
        val realmList = RealmList<Int>()
        `in`.beginArray()
        while (`in`.hasNext()) {
            realmList.add(`in`.nextInt())
        }
        `in`.endArray()
        return realmList
    }
}

注册到Gson:

val gson = com.google.gson.GsonBuilder()
    .registerTypeAdapter(RealmList::class.java, RealmListIntAdapter())
    .create()

方式二:先解析为普通数据类,再手动映射到Realm模型

这种方式更直观,避免复杂的转换器编写:

  1. 定义与JSON结构匹配的普通数据类:
data class ProgramDto(
    val _id: String,
    val weeks: List<Int>
)
  1. 解析JSON到数据类,再转换为Realm对象:
val json = "{ \"_id\": \"63dceb34a8c4bbeee1c807f9\", \"weeks\": [2, 3, 2, 3] }"
// 用你常用的解析库解析,比如Gson/Moshi
val programDto = gson.fromJson(json, ProgramDto::class.java)

// 转换为Realm对象
val programDoc = ProgramDoc().apply {
    _id = programDto._id
    weeks.addAll(programDto.weeks)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:25:25