[英]Kotlin Deserialization - JSON Array to multiple different objects
我正在使用 1.0.0 版本的kotlin 序列化,但是当我尝试反序列化“灵活”数组时卡住了。
从我无法控制的后端 API 中,我返回了一个包含不同类型对象的 JSON 数组。 您将如何使用 kotlin 序列化反序列化它们?
例子
这是 API 的响应
[
{
"id": "test",
"person": "person",
"lastTime": "lastTime",
"expert": "pro"
},
{
"id": "test",
"person": "person",
"period": "period",
"value": 1
}
]
@Serializable
sealed class Base {
@SerialName("id")
abstract val id: String
@SerialName("person")
abstract val person: String
}
@Serializable
data class ObjectA (
@SerialName("id") override val id: String,
@SerialName("title") override val title: String,
@SerialName("lastTime") val lastTime: String,
@SerialName("expert") val expert: String
) : Base()
@Serializable
data class ObjectB (
@SerialName("id") override val id: String,
@SerialName("title") override val title: String,
@SerialName("period") val period: String,
@SerialName("value") val value: Int
) : Base()
执行以下代码会导致错误
println(Json.decodeFromString<List<Base>>(json))
错误Polymorphic serializer was not found for class discriminator
当您说您不控制 API 时,该 JSON 是否是由 Kotlin 序列化库根据您的代码生成的? 或者你想把它变成你自己的类型?
默认情况下,密封类是通过将type
字段添加到对象中的 JSON来处理的,但它是您的Base
类中的一个属性。 在下一个示例中,它将向您展示如何添加@SerialName("owned")
注释来说明每个类对应的type
值,如果您可以向类中添加正确的值,这可能会对您有所帮助? 虽然在你的JSON例如两个对象“类型”为type
...
如果您无法将 API 响应推到正确的位置,您可能必须编写一个自定义序列化程序(这是您关心的反序列化部分)来解析事物并识别每个对象的外观,并构建适当的对象。
(我对图书馆或任何东西都不太了解,只是想给你一些东西看看,看看是否有帮助!)
@cactustictacs 解决方案非常接近。 他说“默认情况下,密封类是通过向 JSON 添加类型字段来处理的”
但是因为我没有type
属性,所以我需要一个其他字段来决定它应该是哪个子类。
在 Kotlin Serializer 中,您可以通过
val format = Json {
classDiscriminator = "PROPERTY_THAT_DEFINES_THE_SUBCLASS"
}
val contentType = MediaType.get("application/json")
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(format.asConverterFactory(contentType))
.build()
在classDiscriminator
您可以输入所需的属性。 希望这可以帮助其他人在未来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.