Kotlinx.Serialization 反序列化日期

ary*_*axt 8 kotlin kotlinx.serialization kotlinx

我很难找到有关如何反序列化日期字段的文档。我该如何实现这一目标?我在 SO 上找到的大多数解决方案都不起作用,或者它们使用不再可用的类

@Serializable
data class Dashboard(
    val someNumber: Int,
    val someDate: Date? // Custom Deserialization from unix timestamp
)
Run Code Online (Sandbox Code Playgroud)

编辑:我发现使用的大多数解决方案PrimitiveSerialDescriptor似乎不可用

小智 13

不要使用 Date,而是使用InstantLocalDateTime,您需要将其添加到 build.gradle 文件中

implementation "org.jetbrains.kotlinx:kotlinx-datetime:0.3.2"
Run Code Online (Sandbox Code Playgroud)

在此链接中阅读更多相关信息: https ://github.com/Kotlin/kotlinx-datetime

这将自动序列化并且也适用于 KMM

  • 鉴于我的 Android 应用程序是用 kotlin 编写的,我认为它很合适,但我还是想通了:P (2认同)

Ale*_*nov 10

对于最新版本的kotlinx.serialization 有很好的文档https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#custom-serializers

PrimitiveSerialDescriptor但是,问题中没有类,这意味着使用了某些旧版本的kotlinx.serialization 。

https://github.com/Kotlin/kotlinx.serialization/releases可以发现,在1.0.0-RC版本中

PrimitiveDescriptor被重命名为PrimitiveSerialDescriptor

@Serializable具有注释和格式的核心工件的 idJson已从 更改kotlinx-serialization-runtimekotlinx-serialization-core更加清晰并与其他 kotlinx 库保持一致。

接下来是kotlinx.serialization版本0.20.0的代码示例:

object DateSerializer : KSerializer<Date> {
    override val descriptor = PrimitiveDescriptor("Date", PrimitiveKind.LONG)
    override fun serialize(encoder: Encoder, value: Date) = encoder.encodeLong(value.time)
    override fun deserialize(decoder: Decoder): Date = Date(decoder.decodeLong())
}

@Serializable
data class MyDto(
    @Serializable(DateSerializer::class)
    val date: Date
)

fun main() {
    val dto = Json.parse(MyDto.serializer(), """{ "date" : 1630407000000 }""")
    println(dto.date)
}
Run Code Online (Sandbox Code Playgroud)

build.gradle.kts

plugins {
    kotlin("jvm") version "1.3.72"
    kotlin("plugin.serialization") version "1.3.72"
}
repositories { mavenCentral() }
dependencies {
    implementation("org.jetbrains.kotlinx", "kotlinx-serialization-runtime", "0.20.0")
}
Run Code Online (Sandbox Code Playgroud)