Created
September 13, 2024 10:21
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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