gpt4 book ai didi

Kotlinx 序列化,避免在其他数据类型上崩溃

转载 作者:行者123 更新时间:2023-12-02 00:12:58 24 4
gpt4 key购买 nike

我在应用程序中使用外部 API,而反序列化是使用 Kotlinx 序列化包完成的,当 api 结果是多个值的 Int 数组和单个值的原始 int 时,我遇到了问题。我怎样才能避免在此过程中崩溃。有没有更好的方法来避免崩溃或创建数据类

例如:

import kotlinx.serialization.Serializable

@Serializable

data class Bookings (val slots: List<Int>)

当插槽具有单值时,API 返回 {slots: 1}当插槽具有多个值时,API 返回 { slots: [1,2,3,4]}

最佳答案

可以使用自定义序列化器来完成:

import kotlinx.serialization.*
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonInput
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.int

@Serializable(with = BookingsSerializer::class)
data class Bookings(val slots: List<Int>)

@Serializer(forClass = Bookings::class)
object BookingsSerializer : KSerializer<Bookings> {
override fun deserialize(decoder: Decoder): Bookings {
val json = (decoder as JsonInput).decodeJson().jsonObject
return Bookings(parseSlots(json))
}

private fun parseSlots(json: JsonObject): List<Int> {
val slotsJson = json["slots"] ?: return emptyList()
return try {
slotsJson.jsonArray.content.map { it.int }
} catch (e: Exception) {
listOf(slotsJson.int)
}
}
}

@ImplicitReflectionSerializer
fun main() {
val json = """{"slots": 1}"""
val result = Json.parse<Bookings>(json)
println(result) // prints Bookings(slots=[1])
}

关于Kotlinx 序列化,避免在其他数据类型上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58229550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com