Can't make work Kotlin PolymorphicSerializer kotlinx.serialization/PolymorphicSerializer

54 Views Asked by At

I am trying to make this thing work for 3 days or so alread. I even registered here (this day has come). Basically, trying to parse json where some elements are objects {}, and some fields are arrays of the objects of the same type [{},{}, ..., {}].

Tried that polmorphic serializer https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization/-polymorphic-serializer/

Compliler just throwing an error Expected class kotlinx.serialization.json.JsonObject as the serialized body of kotlinx.serialization.Polymorphic<FeatWrapper>, but had class kotlinx.serialization.json.JsonArray

Here is sample of json

[
    {"name": "John", "age": 30, "city": "New York"},
    [{"name": "Jane", "age": 32, "city": "Chicago"}, {"name": "Jim", "age": 33, "city": "Los Angeles"}],
    {"name": "Jill", "age": 34, "city": "San Francisco"},
    [{"name": "Jack", "age": 35, "city": "Seattle"}],
    {"name": "Jerry", "age": 36, "city": "Boston"},
    [{"name": "Jenny", "age": 37, "city": "Austin"}, {"name": "Jeff", "age": 38, "city": "Denver"}],
    {"name": "Julia", "age": 39, "city": "Phoenix"},
    [{"name": "Jake", "age": 40, "city": "San Diego"}],
    {"name": "Jess", "age": 41, "city": "Dallas"},
    [{"name": "Jasmine", "age": 42, "city": "Houston"}]
]

Here is dataclass

sealed class WelcomeUnion()

@Serializable
data class WelcomeClassArrayValue(val value: List<WelcomeClass>) : WelcomeUnion()

@Serializable
data class WelcomeClassValue(val value: WelcomeClass) : WelcomeUnion()

@Serializable
data class WelcomeClass(
    val name: String,
    val age: Long,
    val city: String
)

Here is a function

fun testJson() {

        val string = "[\n" +
                "    {\"name\": \"John\", \"age\": 30, \"city\": \"New York\"},\n" +
                "    [{\"name\": \"Jane\", \"age\": 32, \"city\": \"Chicago\"}, {\"name\": \"Jim\", \"age\": 33, \"city\": \"Los Angeles\"}],\n" +
                "    {\"name\": \"Jill\", \"age\": 34, \"city\": \"San Francisco\"},\n" +
                "    [{\"name\": \"Jack\", \"age\": 35, \"city\": \"Seattle\"}],\n" +
                "    {\"name\": \"Jerry\", \"age\": 36, \"city\": \"Boston\"},\n" +
                "    [{\"name\": \"Jenny\", \"age\": 37, \"city\": \"Austin\"}, {\"name\": \"Jeff\", \"age\": 38, \"city\": \"Denver\"}],\n" +
                "    {\"name\": \"Julia\", \"age\": 39, \"city\": \"Phoenix\"},\n" +
                "    [{\"name\": \"Jake\", \"age\": 40, \"city\": \"San Diego\"}],\n" +
                "    {\"name\": \"Jess\", \"age\": 41, \"city\": \"Dallas\"},\n" +
                "    [{\"name\": \"Jasmine\", \"age\": 42, \"city\": \"Houston\"}]\n" +
                "]"

        try {

            val test = Json.decodeFromString<WelcomeUnion>(string)

            Log.d("Deserializer", test.toString())

        } catch (e: SerializationException) {
            Log.e("DatabaseDecoder1", e.message.toString())
        }


    }

PLEASE, HELP.

Everything, really. I expect the thing to parse conditionally if its a item or list of items basically. Also tried to write custom serializer (fields are different from exaple above, apparently), but no luck. The thing seems to be throwing exeption before even gettin here (when decode is called, maybe).

object FeatSerializer : JsonContentPolymorphicSerializer<FeatWrapper>(
    FeatWrapper::class
) {
    override fun selectDeserializer(element: JsonElement): DeserializationStrategy<FeatWrapper> {

        Log.d("DatabaseCreator", "Element is: $element")

        if (element is JsonObject) {
            Log.d("DatabaseCreator", "OBJECT: $element")
            return FeatWrapper.Single.serializer()
        }

        if (element is JsonArray) {
            Log.d("DatabaseCreator", "ARRAY: $element")
            return FeatWrapper.Multiple.serializer()

        } else {
            Log.d("DatabaseCreator", "Something wrong: $element")


            return throw SerializationException("Unknown type for RelatedFormWrapper")
        }


    }
}
0

There are 0 best solutions below