@Serializer(forClass = List::class) class SingleToArraySerializer(private val dataSerializer: KSerializer) : KSerializer> { // note: the parser we use is the same instance as what we have set up in the shared network module, so // that if we need to modify it, we only modify it in one place private val parser = Network().parser @ImplicitReflectionSerializer override val descriptor = SerialDescriptor("com.salonbiz.SingleToArray") { dataSerializer } override fun serialize(encoder: Encoder, value: List) { encoder.encode(ListSerializer(dataSerializer), value) } override fun deserialize(decoder: Decoder): List { return when (val jsonElement = JsonElementSerializer.deserialize(decoder)) { is JsonArray -> jsonElement.content.map { parser.parse(dataSerializer, it.toString()) } else -> listOf(parser.parse(dataSerializer, jsonElement.toString())) } } }