vikas.k
01/27/2020, 10:53 AM@InternalSerializationApi
class CustomDiscriminatorSerializer<T : Any>(
private val sealedClassSerializer: SealedClassSerializer<T>,
private val classDiscriminator: String
) : KSerializer<T> {
override val descriptor: SerialDescriptor
get() = sealedClassSerializer.descriptor
override fun deserialize(decoder: Decoder): T {
val jsonInput = decoder as JsonInput
val jsonTree = jsonInput.decodeJson() as JsonObject
val jsonElement = jsonTree[classDiscriminator]!!
val type = jsonElement.content
(jsonTree.content as MutableMap).remove(classDiscriminator)
@Suppress("UNCHECKED_CAST")
val actualSerializer = sealedClassSerializer.findPolymorphicSerializer(decoder, type) as KSerializer<T>
return jsonInput.json.fromJson(actualSerializer, jsonTree)
}
override fun serialize(encoder: Encoder, obj: T) {
sealedClassSerializer.serialize(encoder, obj)
}
}
and in use it like this
val serialModule = serializersModuleOf(
mapOf(
JsonText::class to CustomDiscriminatorSerializer(JsonText.serializer() as SealedClassSerializer<JsonText>, "data_type"),
JsonItem::class to CustomDiscriminatorSerializer(JsonItem.serializer() as SealedClassSerializer<JsonItem>, "layout")
)
)
val json = Json(
configuration = JsonConfiguration.Default.copy(strictMode = false),
context = serialModule
)
json.parse(JsonItemBenefitsWrapper.serializer(), string)