Сериализация Kotlin: как обрабатывать нулевые значения в пользовательском сериализатореAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Сериализация Kotlin: как обрабатывать нулевые значения в пользовательском сериализаторе

Сообщение Anonymous »

В моем API есть множество значений JSON, которые представляют собой объект JSON со значением, описанием, например:

Код: Выделить всё

{
id: 1321,
season: {
value: *some value*,
description: *some description*
},
...,
type: {
value: *some value*,
description: *some description*
}
}
Поле значения всегда представляет собой какое-то Enum, а описание для меня не несет никакой информативной ценности.
Чтобы избавиться от ненужной вложенности, я попытался создать собственный сериализатор, и он отлично работает:

Код: Выделить всё

@OptIn(ExperimentalSerializationApi::class)
open class EnumSerializer(
private val serializer: KSerializer
) : KSerializer {
override val descriptor: SerialDescriptor = buildClassSerialDescriptor(serializer.descriptor.serialName) {
element("value", serializer().descriptor)
element("description", serializer().descriptor)
}

override fun serialize(encoder: Encoder, value: T) {
encoder.encodeSerializableValue(serializer, value)
}

override fun deserialize(decoder: Decoder): T {
return decoder.decodeStructure(descriptor) {
lateinit var value: String

while (true) {
when (val i = decodeElementIndex(descriptor)) {
CompositeDecoder.DECODE_DONE -> break
0 -> value = decodeStringElement(descriptor, i)
1 -> decodeStringElement(descriptor, i)
else -> throw SerializationException("Unknown index $i")
}
}

defaultJson.decodeFromString(serializer, value)
}
}
}
Затем я использую его следующим образом:

Код: Выделить всё

internal object SeasonEnumSerializer : EnumSerializer(SeasonApi.generatedSerializer())

@OptIn(ExperimentalSerializationApi::class)
@Serializable(with = SeasonEnumSerializer::class)
@KeepGeneratedSerializer
enum class SeasonApi(val value: String) {
@SerialName("winter") WINTER("winter"),
@SerialName("spring") SPRING("spring"),
@SerialName("summer") SUMMER("summer"),
@SerialName("autumn") AUTUMN("autumn");

override fun toString(): String = value
}

@Serializable
data class ReleaseApi(
@SerialName("id") val id: Int,
@SerialName("season") val season: SeasonApi?,
...
@SerialName("type") val type: ReleaseTypeApi?,
...
)
Однако поведение сериализатора нарушается, когда из API поступают нулевые значения:

Код: Выделить всё

{
value: null,
description: null
}
Я пометил поля сезона и типа как обнуляемые в моей модели ReleaseApi. Я также установил флаги isLenient, ignoreUnknownKeys и coerceInputValues. Но это не работает.
Как мне обрабатывать нулевые значения?

Подробнее здесь: https://stackoverflow.com/questions/793 ... serializer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»