我有一个具有计算属性的数据类:
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
data class Mcve (
val account: String
) {
@SerialName("type")
val type =
if (account.startsWith("1"))
"preferred"
else
"regular"
}
fun main() {
println(Json.encodeToString(Mcve.serializer(), Mcve("12345")))
}
我想要type
序列化该属性,但序列化框架忽略它。上面main
只是打印:
{"account":"12345"}
我尝试lazy
像下面一样使用,但结果是相同的,它type
不包含在 JSON 中。
@SerialName("type")
val type : String by lazy {
if (account.startsWith("1"))
"preferred"
else
"regular"
}
如何将 包含type
在 JSON 对象中?
该库目前尚未提供此功能,正如评论中 @AlexT 链接的GitHub 问题所证明的那样。看起来库作者将被迫在不久的将来再次考虑这个问题,因为 Kotlin 很快就会实现一个新的支持字段功能。
我注意到,如果您要序列化以在公共代码中共享类定义的两个 Kotlin 程序之间传输对象,那么这不是问题,因为反序列化器将在实例化类时重新创建该属性。但这是在您将对象传递给非 Kotlin 接收者时(大概在您的情况下)。
目前解决该问题的方法是使用代理序列化器1。在您的情况下,这将是编写一个新类来表示您想要的 JSON 形式,并将该
type
属性作为常规属性:然后您可以使用它作为新序列化器的基础:
最后,您可以指示框架在原始类上使用它:
1如果您打算定期使用此框架并且与非标准类一起使用,那么这是一种非常常见的模式。