user2233706
user2233706

Reputation: 7225

Serialize ZonedDateTime in Kotlin data class

I get the following error when I serialize a ZonedDateTime field in a data class:

Type mismatch: inferred type is KClass<ZonedDateTimeSerializer> but KClass<out KSerializer<*>> was expected

Here is my class:

import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer
import kotlinx.serialization.Serializable
import java.time.ZonedDateTime

@Serializable
data class MyClass(
    @Serializable(ZonedDateTimeSerializer::class)
    val time: ZonedDateTime
)

How can I serialize a ZonedDateTime in Kotlin?

Upvotes: 7

Views: 4963

Answers (1)

user2233706
user2233706

Reputation: 7225

Here's what I did:

object KZonedDateTimeSerializer : KSerializer<ZonedDateTime> {
    override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ZonedDateTime", PrimitiveKind.STRING)

    override fun serialize(encoder: Encoder, value: ZonedDateTime) {
        encoder.encodeString(value.toString())
    }

    override fun deserialize(decoder: Decoder): ZonedDateTime {
        val string = decoder.decodeString()
        return ZonedDateTime.parse(string)
    }
}

Here's for OffsetDateTime. If you don't specify a formatter, the minute is removed if it is zero:

object KOffsetDateTimeSerializer : KSerializer<OffsetDateTime> {
    override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING)

    override fun serialize(encoder: Encoder, value: OffsetDateTime) {
        val format = DateTimeFormatter.ISO_OFFSET_DATE_TIME

        val string = format.format(value)
        encoder.encodeString(string)
    }

    override fun deserialize(decoder: Decoder): OffsetDateTime {
        val string = decoder.decodeString()
        return OffsetDateTime.parse(string)
    }
}

Upvotes: 13

Related Questions