franztesca
10/05/2023, 9:31 PM// type RemoteMessage = string | ComplexClass
// valid RemoteMessages:
// 'hello'
// { blahBlah: 'hello' }
@Serializable
sealed class RemoteMessage {
@Serializable
data class StringType(val value: String): RemoteMessage()
@Serializable
data class ComplexType(val value: ComplexClass): RemoteMessage()
object Serializer: JsonContentPolymorphicSerializer<RemoteMessage>(RemoteMessage::class) {
override fun selectDeserializer(element: JsonElement): KSerializer<out RemoteMessage> {
return when (element) {
is JsonPrimitive -> StringType.serializer()
is JsonObject -> ComplexType.serializer()
else -> error("Unsupported type: ${element::class}")
}
}
}
}
@Serializable
data class ComplexClass(
val blahBlah: String,
// ...
)
fun main() {
// should print hello, prints {"value":"hello"}
println(Json.encodeToString(RemoteMessage.StringType("hello")))
// should print {"blahBlah":"hello"}, prints {"value":{"blahBlah":"hello"}}
println(Json.encodeToString(RemoteMessage.ComplexType(ComplexClass("hello"))))
}
Adam S
10/05/2023, 9:38 PMStringType
, then it should be encoded as a JSON string
https://github.com/Kotlin/kotlinx.serialization/blob/v1.6.0/docs/value-classes.md#serializable-value-classesfranztesca
10/05/2023, 9:40 PMAdam S
10/05/2023, 9:41 PM