首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kotlinx.serialization中的可选字段vs空值

kotlinx.serialization中的可选字段vs空值
EN

Stack Overflow用户
提问于 2021-05-25 19:44:11
回答 2查看 978关注 0票数 4

如何在kotlinx.serialization反序列化JSON时区分{data: null}{}

代码语言:javascript
复制
@Serializable
class MyClass(val data: String?)
EN

回答 2

Stack Overflow用户

发布于 2021-05-25 19:59:12

您需要一个自定义设置器和一个私有布尔字段来指示字段值是否被触及。所以,就像:

代码语言:javascript
复制
@Serializable
class MyClass {
    private var isDataTouched = false

    val data: String
        set(value) {        
            field = value
            isDataTouched = true
        }
}

注意,不能在默认构造函数中定义字段。

票数 0
EN

Stack Overflow用户

发布于 2021-05-26 12:21:22

您可以利用多态JsonContentPolymorphicSerializer来区分您正在反序列化的响应类型:

代码语言:javascript
复制
@Serializable(with = MyResponseSerializer::class)
sealed class MyResponse

@Serializable
class MyEmptyClass : MyResponse()

@Serializable
class MyClass(val data: String?) : MyResponse()

// this serializer is reponsible for determining what class we will receive
// by inspecting json structure
object MyResponseSerializer : JsonContentPolymorphicSerializer<MyResponse>(MyResponse::class) {
    override fun selectDeserializer(element: JsonElement) = when {
        "data" in element.jsonObject -> MyClass.serializer()
        else -> MyEmptyClass.serializer()
    }
}

之后,使用MyResponse类反序列化,您将收到MyEmptyClassMyClass

代码语言:javascript
复制
val e = Json.decodeFromString<MyResponse>("""{}""")             // returns MyEmptyClass object
val o = Json.decodeFromString<MyResponse>("""{"data": null}""") // returns MyClass object

println(Json.encodeToString(e)) // {}
println(Json.encodeToString(o)) // {"data": null}

// since sealed class is the parent we can have exhaustive when:
when(e) {
    is MyClass -> TODO("handle response with data")
    is MyEmptyClass -> TODO("handle empty response")
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67694640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档