How would I go about deserializing a top-level Jso...
# serialization
r
How would I go about deserializing a top-level JsonArray (
["v1", "v2", "v3"]
) as a data class?
Copy code
@Serializable
data class VersionResponse(val versions: List<String>)
I've made several attempts with
JsonTransformingSerializer
, but no dice! 😔
e.g., this fails with:
Copy code
java.lang.reflect.InvocationTargetException
	at kotlinx.serialization.internal.PlatformKt.invokeSerializerOnCompanion(Platform.kt:106)
	at kotlinx.serialization.internal.PlatformKt.constructSerializerForGivenTypeArgs(Platform.kt:41)
	at kotlinx.serialization.internal.PlatformKt.compiledSerializerImpl(Platform.kt:23)
	at kotlinx.serialization.SerializersKt__SerializersKt.serializerOrNull(Serializers.kt:178)
	at kotlinx.serialization.SerializersKt.serializerOrNull(Unknown Source)
	at kotlinx.serialization.SerializersKt__SerializersKt.serializerByKTypeImpl$SerializersKt__SerializersKt(Serializers.kt:83)
	at kotlinx.serialization.SerializersKt__SerializersKt.serializer(Serializers.kt:59)
	at kotlinx.serialization.SerializersKt.serializer(Unknown Source)
Caused by: java.lang.NullPointerException: Parameter specified as non-null is null: method kotlinx.serialization.json.JsonTransformingSerializer.<init>, parameter tSerializer
	at kotlinx.serialization.json.JsonTransformingSerializer.<init>(JsonTransformingSerializer.kt)
Looking through the documentation, it's evident that there's a key element not clicking my brain... just trying to determine what that is! https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md#array-wrapping
Oddly, it seems that this works:
Copy code
@Serializable
data class VersionResponse(val versions: List<String>)

fun main() {
    println(Json.decodeFromString(VersionsResponseSerializer, """["v1","v2"]"""))
}
Any idea why
@Serializable(VersionResponseSerializer::class)
breaks it? 🤔 I guess there's some recursion happening... but, in that case, I'm not sure what I should be passing to
JsonTransformingSerializer
. Perhaps another custom serializer?
Still scratching my head a bit, but I was able to get it working by writing these two serializers manually. This is probably not ideal. 😅
p
One option, if you aren't actually adding (much) to this
VersionResponse
class and just want to indicate it's a unique type, is to use a
value class
r
@Paul Griffith Brilliant. 🤯
👍 1