繁体   English   中英

Kotlin 反序列化 - JSON 数组到多个不同的对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM