object KotlinSerializationConverter : Converter { /** @return [Any] created by converting [HttpResponse] to the given [KType], with [JSON] */ @ImplicitReflectionSerializer override suspend operator fun invoke( response: HttpResponse, kType: KType ) : Any { return when( kType.classifier as KClass<*> ) { HttpResponse::class -> response ByteArray::class -> response.readBytes() String::class -> response.readText() List::class -> JSON.parseList( kType, response.readText() ) Map::class -> JSON.parseMap( kType, response.readText() ) else -> JSON.parse( kType, response.readText() ) } } /** @see kotlinx.serialization.parse */ @ImplicitReflectionSerializer fun StringFormat.parse( kType: KType, str: String ): Any = parse( context.getOrDefault( kType.classifier as KClass<*> ), str ) /** @see kotlinx.serialization.parseList */ @ImplicitReflectionSerializer fun StringFormat.parseList( kType: KType, objects: String ): List { val kClass = kType.arguments.first().type!!.classifier as KClass<*> return parse( context.getOrDefault( kClass ).list, objects ) } /** @see kotlinx.serialization.parseMap */ @ImplicitReflectionSerializer fun StringFormat.parseMap( kType: KType, map: String ): Map { val kTypeArgs = kType.arguments val kClassK = kTypeArgs[0].type!!.classifier as KClass<*> val kClassV = kTypeArgs[1].type!!.classifier as KClass<*> val kSerializerK = context.getOrDefault( kClassK ) as KSerializer val kSerializerV = context.getOrDefault( kClassV ) as KSerializer return parse( ( kSerializerK to kSerializerV ).map, map ) } }