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模型
这种方式更直观,避免复杂的转换器编写:
- 定义与JSON结构匹配的普通数据类:
data class ProgramDto( val _id: String, val weeks: List<Int> )
- 解析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
相关产品推荐
相关产品推荐

