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")
}
}
}