I'm trying to deserialize a JSON like this (much more complex, but this is the essential part):
[
{
"field": "field1",
"value": [1000, 2000]
},
{
"field": "field2",
"value": 1
},
{
"field": "field2",
"value":["strval2","strval3"]
},
{
"field": "field4",
"value": "strval1"
}
]
I've tried to figure out how to use JsonContentPolymorphicSerializer in different variants but it all ends up the same: class java.util.ArrayList cannot be cast to class myorg.ConditionValue (java.util.ArrayList is in module java.base of loader 'bootstrap'; myorg.ConditionValue is in unnamed module of loader 'app')
@Serializable
sealed class ConditionValue
@Serializable(with = StringValueSerializer::class)
data class StringValue(val value: String) : ConditionValue()
@Serializable(with = StringListValueSerializer::class)
data class StringListValue(val value: List<StringValue>) : ConditionValue()
object ConditionSerializer : JsonContentPolymorphicSerializer<Any>(Any::class) {
override fun selectDeserializer(element: JsonElement) = when (element) {
is JsonPrimitive -> StringValueSerializer
is JsonArray -> ListSerializer(StringValueSerializer)
else -> StringValueSerializer
}
}
object StringValueSerializer : KSerializer<StringValue> {
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("StringValue")
override fun deserialize(decoder: Decoder): StringValue {
require(decoder is JsonDecoder)
val element = decoder.decodeJsonElement()
return StringValue(element.jsonPrimitive.content)
}
override fun serialize(encoder: Encoder, value: StringValue) {
encoder.encodeString(value.value)
}
}
What am I missing? And how to approach it?