Bernhard
08/27/2026, 11:45 AMobject LanguageIsoSerializer : KSerializer<LanguageIso?> {
private val delegate = serializer<LanguageIso>().nullable
private val parsingDelegate = serializer<String>().nullable
override val descriptor: SerialDescriptor
get() = SerialDescriptor("at.fyayc.emporixapi.i18n.LanguageIso", delegate.descriptor)
override fun serialize(
encoder: Encoder,
value: LanguageIso?
) {
delegate.serialize(encoder, value)
}
override fun deserialize(decoder: Decoder): LanguageIso? {
val string = parsingDelegate.deserialize(decoder)
return if (string.isNullOrBlank()) {
null
} else {
delegate.deserialize(decoder)
}
}
}
Technically I could use the parsed string and just iterate over enum entries, but that would ignore any annotation on the enum itself like @SerialNameephemient
08/27/2026, 12:22 PM(decoder as JsonDecoder).json.decodeFromElement(delegate, JsonPrimitive(string))
there isn't a general way to do this for other formatsBernhard
08/27/2026, 12:23 PMephemient
08/27/2026, 12:25 PMparsingDelegate and instead use (decoder as JsonDecoder).decodeJsonElement() but it works out the samephldavies
08/27/2026, 12:27 PMephemient
08/27/2026, 12:28 PMBernhard
08/27/2026, 12:29 PMBernhard
08/27/2026, 12:29 PMoverride fun deserialize(decoder: Decoder): LanguageIso? {
if (decoder !is JsonDecoder) throw SerializationException("Can only deserialize JSON")
val string = parsingDelegate.deserialize(decoder)
return if (string.isNullOrBlank()) {
null
} else {
// since string was consumed from parser stream, if we just passed the decoder, it'd be gone
// so instead, wrap it in a JSON element again
decoder.json.decodeFromString<LanguageIso>(string)
}
}Bernhard
08/27/2026, 12:29 PMephemient
08/27/2026, 12:30 PMBernhard
08/27/2026, 12:31 PMephemient
08/27/2026, 12:33 PMephemient
08/27/2026, 12:36 PMobject LanguageIsoSerializer : JsonTransformingSerializer<LanguageIso?>(LanguageIso.serializer().nullable) {
override fun transformDeserialize(element: JsonElement): JsonElement =
if (<http://element.primitive.content.is|element.primitive.content.is>Empty()) JsonNull else element
}
which may be better suited for your specific caseBernhard
08/27/2026, 12:36 PMBernhard
08/27/2026, 12:39 PMobject LanguageIsoSerializer2 : JsonTransformingSerializer<LanguageIso?>(serializer<LanguageIso>().nullable) {
override fun transformDeserialize(element: JsonElement): JsonElement =
if (element is JsonPrimitive && element.content.isBlank()) {
JsonNull
} else {
element
}
}Bernhard
08/27/2026, 12:40 PMBernhard
08/27/2026, 12:40 PMfinal override fun deserialize(decoder: Decoder): T {
val input = decoder.asJsonDecoder()
val element = input.decodeJsonElement()
return input.json.decodeFromJsonElement(tSerializer, transformDeserialize(element))
}