首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kotlinx.serialization.MissingFieldException:字段“X”是使用串行名称的类型所必需的,但它在kotlin中丢失了错误

kotlinx.serialization.MissingFieldException:字段“X”是使用串行名称的类型所必需的,但它在kotlin中丢失了错误
EN

Stack Overflow用户
提问于 2022-11-24 13:37:02
回答 1查看 18关注 0票数 0

我正在制作一个字典应用程序,我在资产文件中有自己的json数据集。我第一次从这组数据中读取数据并将其保存到房间,然后再从这个房间读取其他时间的数据。但是,我遇到了这个错误。

代码语言:javascript
复制
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.enestigli.dictionaryapp, PID: 1868
    kotlinx.serialization.MissingFieldException: Field 'example' is required for type with serial name 'com.enestigli.dictionaryapp.data.locale.datamodel.Idioms', but it was missing
        at kotlinx.serialization.internal.PluginExceptionsKt.throwMissingFieldException(PluginExceptions.kt:20)
        at com.enestigli.dictionaryapp.data.locale.datamodel.Idioms.<init>(Idiom.kt:28)
        at com.enestigli.dictionaryapp.data.locale.datamodel.Idioms$$serializer.deserialize(Idiom.kt:28)
        at com.enestigli.dictionaryapp.data.locale.datamodel.Idioms$$serializer.deserialize(Idiom.kt:28)
        at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
        at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
        at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:535)
        at kotlinx.serialization.internal.ListLikeSerializer.readElement(CollectionSerializers.kt:80)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
        at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
        at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
        at com.enestigli.dictionaryapp.data.locale.datamodel.IdiomItem$$serializer.deserialize(Idiom.kt:15)
        at com.enestigli.dictionaryapp.data.locale.datamodel.IdiomItem$$serializer.deserialize(Idiom.kt:15)
        at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
        at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
        at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:535)
        at kotlinx.serialization.internal.ListLikeSerializer.readElement(CollectionSerializers.kt:80)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
        at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
        at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
        at com.enestigli.dictionaryapp.data.locale.datamodel.IdiomDataModel$$serializer.deserialize-zhuhEdE(Idiom.kt:8)
        at com.enestigli.dictionaryapp.data.locale.datamodel.IdiomDataModel$$serializer.deserialize(Idiom.kt:8)
        at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
        at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
        at kotlinx.serialization.json.Json.decodeFromString(Json.kt:100)
        at com.enestigli.dictionaryapp.data.locale.datasource.AssetDataSource.getIdioms-zhuhEdE(AssetsDataSource.kt:84)
E/AndroidRuntime:     at com.enestigli.dictionaryapp.data.repository.IdiomsRepositoryImpl.initData(IdiomsRepositoryImpl.kt:21)
        at com.enestigli.dictionaryapp.domain.use_case.idiom.insert.InsertIdiomsUseCase.initIdiomData(InsertIdiomsUseCase.kt:12)
        at com.enestigli.dictionaryapp.presentation.SplashScreen.SplashScreenViewModel$insertAllDataToRoomDb$1.invokeSuspend(SplashScreenViewModel.kt:38)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at android.os.Handler.handleCallback(Handler.java:942)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7898)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
        Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@5aeb15c, Dispatchers.Main.immediate]

我的json数据集看起来像这个

代码语言:javascript
复制
[
    {
        "letter": "A",
        "idioms": [
            {
                "idiom": "above board",
                "meaning": "If something is above board, it's been done in a legal and honest way.",
                "examples": [
                    "I'm sure the deal was completely above board as I know James well and he'd never do anything illegal or corrupt.",
                    "The minister claimed all the appointments were above board and denied claims that some positions had been given to his friends."
                ]
            },
            {
                "idiom": "above the law",
                "meaning": "If someone is above the law, they are not subject to the laws of a society.",
                "examples": [
                    "Just because his father is a rich and powerful man, he seems to think he's above the law and he can do whatever he likes.",
                    "In a democracy, no-one is above the law - not even a president or a prime-minister."
                ]
            },
            {
                "idiom": "Achilles' heel",
                "meaning": "An Achilles' heel is a weakness that could result in failure.",
                "examples": [
                    "He's a good golfer, but his Achilles' heel is his putting and it's often made him lose matches.",
                    "The country's dependence on imported oil could prove to be its Achilles' heel if prices keep on rising."
                ]
            },

我的数据模型

代码语言:javascript
复制
@JvmInline
@Serializable
value class IdiomDataModel(
    val allData: List<IdiomItem>
)


@Serializable
data class IdiomItem(
    val letter: String,
    val idioms: List<Idioms>
) {

    fun toEntity() = IdiomEntity(
        letter = letter,
        idioms = idioms
    )
}


@Serializable
data class Idioms(
    val idiom: String,
    val meaning: String,
    val example: List<String>
)

实体

代码语言:javascript
复制
@Entity(tableName = "idioms")
data class IdiomEntity(

    @ColumnInfo(name = "letter") val letter:String,
    @ColumnInfo(name = "idioms") val idioms:List<Idioms>,
    @PrimaryKey(autoGenerate = true) val uid:Int? = null


)

我认为val example: List<String>Idioms data class是从这一部分。这可能与Json数据集中的example列表不完全匹配吗?

EN

回答 1

Stack Overflow用户

发布于 2022-11-24 16:44:15

在习语数据类中,将示例重命名为示例,它应该可以工作。

旧:

代码语言:javascript
复制
@Serializable
data class Idioms(
    val idiom: String,
    val meaning: String,
    val example: List<String>
)

新的

代码语言:javascript
复制
@Serializable
    data class Idioms(
        val idiom: String,
        val meaning: String,
        val examples: List<String>
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74561661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档