kotlinx.serialization конвертировать Int в логическое значение с помощью специального сериализатора

Я уже потратил много времени, пытаясь написать собственный сериализатор, чтобы заменить Int (TINYINT from mysql) на Boolean во время сериализации.

С помощью Gson я делаю это без проблем, что-то вроде этого (Java):

    public class BooleanSerializer implements JsonSerializer<Boolean>, JsonDeserializer<Boolean> {

    @Override
    public JsonElement serialize(Boolean arg0, Type arg1, JsonSerializationContext arg2) {
        return new JsonPrimitive(arg0 ? 1 : 0);
    }

    @Override
    public Boolean deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
        return arg0.getAsInt() == 1;
    }
}
GsonBuilder().registerTypeAdapter(Boolean.class, serializer)

Может быть, кто-то уже решил подобную проблему с помощью библиотеки kotlinx.serialization?

Спасибо.

1 ответ

Скорее всего, это невозможно:(единственное решение, которое я нашел:

  1. создание кастома "BooleanWraper"
  2. переопределить методы сериализатора "сохранить" и "загрузить"
  3. используйте "BooleanWraper" вместо Boolean

    @Serializable
    data class BooleanWraper(val value: Boolean){
    
    @Serializer(forClass = BooleanWraper::class)
    companion object : KSerializer<BooleanWraper> {
        override fun save(output: KOutput, obj: BooleanWraper) =
            output.writeIntValue(if (obj.value) 1 else 0)
    
        override fun load(input: KInput): BooleanWraper=
            BooleanWraper(input.readNullable(IntSerializer) == 1)
    }
    

    }

Используя обертку:

@Serializable
data class Example(
    @SerialName("my_bool") val myBool: BooleanWraper
)
Другие вопросы по тегам