dallas
06/05/2023, 8:24 PMdata class MyType(val value: String)
I want to be able to add @Serializable(with = MyTypeSerializer::class)
and have it deserialize as described, for either:
"my type value"
or
{
...
"expected_key": "my type value"
...
}
disregarding any other values in this object as they're unimportant
Are there any existing serializers that help with this (similar to JsonTransformingSerializer
, except that I need to be able to set the @Serializable
on MyType
so I can't use that as the generic type on JsonTransformingSerializer
)?Adam S
06/05/2023, 8:27 PMdata class MyType<T>(val value: T)
dallas
06/05/2023, 8:29 PMephemient
06/05/2023, 8:29 PMobject MyTypeSerializer : KSerializer<MyType> {
override val descriptor: SerialDescriptor = SerialDescriptor("MyType", JsonElement.serializer().descriptor)
override fun serialize(encoder: Encoder, value: MyType) {
encoder.encodeString(value.value)
}
override fun deserialize(decoder: Decoder): MyType {
val element = (decoder as JsonDecoder).decodeJsonElement()
val value = when (element) {
is JsonPrimitive -> element.contentOrNull
is JsonObject -> element["expected_key"]?.jsonPrimitive?.contentOrNull
else -> null
} ?: throw SerializationException("unable to deserialize")
return MyType(value)
}
}
dallas
06/05/2023, 8:30 PMdallas
06/05/2023, 8:30 PMAdam S
06/05/2023, 8:31 PMephemient
06/05/2023, 8:32 PMephemient
06/05/2023, 8:33 PMdallas
06/05/2023, 8:35 PMAdam S
06/05/2023, 8:35 PMval delegate = MyTypeDelegate.serializer()
override fun deserialize(decoder: Decoder): MyType {
if (decoder !is JsonDecoder) return delegate.decode(decorder).toMyType()
val element = decoder.decodeJsonElement()
// ...
}
but it doesn’t make a lot of difference if you’re only doing JSONAdam S
06/05/2023, 8:37 PMif (decoder !is JsonDecoder) error("Only JSON is supported")
ephemient
06/05/2023, 8:38 PMas
throws but yeah you can do thatAdam S
06/05/2023, 8:39 PM