gpt4 book ai didi

kotlin - 根据字段值反序列化为密封子类

转载 作者:行者123 更新时间:2023-12-02 12:21:35 25 4
gpt4 key购买 nike

我有一个字段,我想根据该 Json 对象上的值将其反序列化为密封子类的实例。

[
{
"id": 1L,
"some_array": [],
"my_thing": {
"type": "sealed_subclass_one",
"other_thing": {
"thing": "thing is a string"
}
}
}, {
"id": 2L,
"some_array": [],
"my_thing": {
"type": "sealed_subclass_two",
"other_thing": {
"other_thing": "other_thing is a string too"
}
}
},
]

响应模型:

@Serializable
data class MyResponse(
@SerialName("id")
val id: Long

@SerialName("some_array")
val someArray: Array<Something>

@SerialName("my_thing")
val myThing: MySealedClassResponse
)

我的密封类

@Serializable
sealed class MySealedClassResponse : Parcelable {
@Serializable
@SerialName("type")
data class SealedSubclassOne(
val thing: String
) : MySealedClassResponse()

@Serializable
@SerialName("type")
data class SealedSubclassTwo(
val otherThing: String
) : MySealedClassResponse()
}

就目前而言,我遇到了一个序列化异常,因为序列化程序不知道该怎么做:

kotlinx.serialization.SerializationException:sealed_subclass_one 未在类 com.myapp.MyResponse 的范围内注册多态序列化

是否有一种简单的方法来注册 type 的值,以便在没有自定义序列化程序的情况下进行反序列化?

最佳答案

我相信如果您将 @SerialName("type") 更改为 @SerialName("sealed_subclass_one")(对于 SealedSubclassTwo 也是如此声明)它应该能够找到正确的序列化程序。

sealed 子类型上的 SerialName 属性是为了将 json 的 type 属性与适当的子类(因此适当的序列化器实例)。

参见 https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#a-bit-of-customizing更多细节。但该文档的相关部分是:

By default, encoded type name is equal to class' fully-qualified name. To change that, you can annotate the class with @SerialName annotation

关于kotlin - 根据字段值反序列化为密封子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59743124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com