I'm trying to serialize an object into json format using encodeToJsonElement
.
import kotlinx.serialization.ContextualSerializer
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.encodeToJsonElement
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.serializer
@Serializable
data class Person(
val name: String
)
@OptIn(ExperimentalSerializationApi::class)
private val json = Json {
SerializersModule {
contextual(Any::class, DynamicLookupSerializer)
}
}
fun main() {
f(Person("jack"))
}
fun f(data: Any) {
val d = json.encodeToJsonElement(data)
}
@ExperimentalSerializationApi
object DynamicLookupSerializer : KSerializer<Any> {
override val descriptor: SerialDescriptor =
ContextualSerializer(Any::class, null, emptyArray()).descriptor
@OptIn(InternalSerializationApi::class)
override fun serialize(encoder: Encoder, value: Any) {
val actualSerializer =
encoder.serializersModule.getContextual(value::class) ?: value::class.serializer()
encoder.encodeSerializableValue(actualSerializer as KSerializer<Any>, value)
}
override fun deserialize(decoder: Decoder): Any {
error("Unsupported")
}
}
but this doesn't work.
Exception in thread "main" kotlinx.serialization.SerializationException: Serializer for class 'Any' is not found.
Please ensure that class is marked as '@Serializable' and that the serialization compiler plugin is applied.