Skip to content

Instantly share code, notes, and snippets.

@pdvrieze
Created September 13, 2024 10:21
Show Gist options
  • Save pdvrieze/79980db68443b16681742cc0ef81c2f6 to your computer and use it in GitHub Desktop.
Save pdvrieze/79980db68443b16681742cc0ef81c2f6 to your computer and use it in GitHub Desktop.
Sample implementation of a serializer that, for json, encodes/decodes single element lists as their element directly.
import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.JsonEncoder
class JsonOrListSerializer<T>(private val elementSerializer: KSerializer<T>): KSerializer<List<T>> {
private val listSerializer = ListSerializer(elementSerializer)
override val descriptor: SerialDescriptor = SerialDescriptor("JsonOrListSerializer", listSerializer.descriptor)
override fun deserialize(decoder: Decoder): List<T> {
if (decoder !is JsonDecoder) return listSerializer.deserialize(decoder)
val elem = decoder.decodeJsonElement()
return when (elem) {
is JsonArray -> decoder.json.decodeFromJsonElement(listSerializer, elem)
else -> listOf(decoder.json.decodeFromJsonElement(elementSerializer, elem))
}
}
override fun serialize(encoder: Encoder, value: List<T>) {
when {
// this is to show how this would work
encoder is JsonEncoder && value.size == 1 ->
encoder.encodeSerializableValue(elementSerializer, value.single())
else -> listSerializer.serialize(encoder, value)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment