zt
03/06/2023, 5:06 AMabstract class SingletonMapPolymorphicSerializer<T : Any>(
tSerializer: KSerializer<T>,
private val discriminator: String = tSerializer.descriptor.annotations.firstNotNullOfOrNull { it as? JsonClassDiscriminator? }?.discriminator ?: "type"
) : JsonTransformingSerializer<T>(tSerializer) {
final override fun transformDeserialize(element: JsonElement) = buildJsonObject {
val (type, value) = element.jsonObject.entries.single()
put(discriminator, type)
value.jsonObject.forEach { (k, v) -> put(k, v) }
}
final override fun transformSerialize(element: JsonElement) = buildJsonObject {
putJsonObject(element.jsonObject.getValue(discriminator).jsonPrimitive.content) {
element.jsonObject.forEach { (k, v) -> if (k != discriminator) put(k, v) }
}
}
}
@Serializable
sealed interface Example {
object Serializer : SingletonMapPolymorphicSerializer<Example>(serializer())
}
class ExampleBody {
val example: @Serializable(Example.Serializer::class) Example
}
Is there anyway to remove the need for having to declare a Serializer object within the class? Ideally I should be able to just annotate the Example
interface with the serializable annotation and it would workephemient
03/06/2023, 7:50 AMephemient
03/06/2023, 7:52 AM