Andrey Tabakov
05/22/2024, 8:00 AM@Serializable
sealed interface FieldType
@Serializable
public enum class PrimitiveType: FieldType {
String,
Boolean
}
with custom serializer
buildClassSerialDescriptor("PrimitiveType") { element("name", String.serializer().descriptor) } // {"value":["PrimitiveType",{"name":"String"}]}
now I want to migrate all my previous json to new structure
PrimitiveSerialDescriptor("primitiveType", STRING) // {"value":["PrimitiveType","String"]}
Is there a way to achieve that? May be some custom serialization tips like try to decode with oldDescriptor and if it fails decode with new descriptor?ephemient
05/22/2024, 5:16 PMclass UnwrapEnumSerializer<E : Enum<E>>(kSerializer: KSerializer<E>) : JsonTransformingSerializer<E>(kSerializer) {
override fun transformDeserialize(element: JsonElement): JsonElement =
if (element is JsonObject) element.jsonObject["name"] ?: JsonNull else element
}
ephemient
05/22/2024, 5:23 PMobject PrimitiveTypeSerializer : KSerializer<PrimitiveType> {
override val descriptor: SerialDescriptor =
SerialDescriptor("PrimitiveType", JsonElement.serializer().descriptor)
override fun deserialize(decoder: Decoder): PrimitiveType {
val jsonName = when (val jsonElement = (decoder as JsonDecoder).decodeJsonElement()) {
is JsonPrimitive -> jsonElement
is JsonObject -> jsonElement["name"]
else -> null
}
if (jsonName is JsonPrimitive && jsonName.isString) {
return PrimitiveType.valueOf(jsonName.content)
} else {
throw SerializationException()
}
}
override fun serialize(encoder: Encoder, value: PrimitiveType) {
encoder.encodeString(value.name)
}
}