https://kotlinlang.org logo
#android
Title
# android
s

Sumeet Parmar

11/20/2023, 10:58 PM
I have a network response with a simple root level object, how can I deserialize with eg
data class NetworkResponse<T> (val data: T)
where the response has no data field and all the json key/value deserialize into provided class?
e

ephemient

11/20/2023, 11:13 PM
it would be easier to deserialize into
T
and then wrap in
NetworkResponse
if you need
s

Sumeet Parmar

11/20/2023, 11:15 PM
hm, I’m trying to avoid writing a custom deserializer for the wrapper and attempting —
Copy code
@Serializable
private data class NetworkResponse<T>(
  @SerialName("$")
  val data: T,
)
the
$
obviously doesn’t work …
e

ephemient

11/20/2023, 11:17 PM
I mean, wherever you are doing
Copy code
json.decodeFromString<NetworkResponse<Foo>>(...)
instead do
Copy code
NetworkResponse(json.decodeFromString<Foo>(...))
it is possible to
Copy code
@Serializable(with = NetworkResponseSerializer::class)
class NetworkResponse<T>(val data: T)

class NetworkResponseSerializer<T>(private val tSerializer: KSerializer<T>) : KSerializer<NetworkResponse<T>> {
    override val descriptor: SerialDescriptor =
        SerialDescriptor("NetworkResponse<${tSerializer.descriptor.serialName}>", tSerializer.descriptor)

    override fun deserialize(decoder: Decoder): NetworkResponse<T> =
        NetworkResponse(decoder.decodeSerializableValue(tSerializer))

    override fun serialize(encoder: Encoder, value: NetworkResponse<T>) {
        encoder.encodeSerializableValue(tSerializer, value.data)
    }

}
but there's not many real advantages over that
s

Sumeet Parmar

11/20/2023, 11:19 PM
yea- I’m using alongside
retrofit
and was wondering if I can just rewrite the response into a map with
data
field …