Hi :raised_hands: How can I deserialize the follow...
# serialization
s
Hi 🙌 How can I deserialize the following JSON (notice the nested JSON string) painlessly?
Copy code
{
  "value": "{\"real_value\": 100 }"
}
Alright, the following seems to work:
Copy code
@Serializable
data class OuterObject(
    @SerialName("value")
    @Serializable(with = InnerObjectFromJsonStringSerializer::class)
    val value: InnerObject
)

@Serializable
data class InnerObject(
    @SerialName("real_value")
    val realValue: Int
)

object InnerObjectFromJsonStringSerializer : JsonStringSerializer<InnerObject>(InnerObject.serializer())

open class JsonStringSerializer<T : Any>(private val deserializationStrategy: DeserializationStrategy<T>) : KSerializer<T> {
    override val descriptor: SerialDescriptor
        get() = TODO("Not yet implemented")

    override fun deserialize(decoder: Decoder): T {
        return (decoder as JsonDecoder).json.decodeFromString(deserializationStrategy, decoder.decodeString())
    }

    override fun serialize(encoder: Encoder, value: T) =
        TODO("Not yet implemented")
}
e
Copy code
object InnerObjectFromJsonStringSerializer : KSerializer<InnerObject> by JsonStringSerializer(InnerObject.serializer())

class JsonStringSerializer<T>(private val tSerializer: KSerializer<T>) : KSerializer<T> {
    override val descriptor: SerialDescriptor =
        PrimitiveSerialDescriptor(tSerializer.descriptor.serialName, PrimitiveKind.STRING)

    override fun deserialize(decoder: Decoder): T =
        (decoder as JsonDecoder).json.decodeFromString(tSerializer, decoder.decodeString())

    override fun serialize(encoder: Encoder, value: T) {
        encoder.encodeString((encoder as JsonEncoder).json.encodeToString(tSerializer, value))
    }
}
🙌 1
s
Thanks!