Kotlinx序列化-自定义序列化程序忽略空值

时间:2019-09-23 06:04:18

标签: kotlin serialization json-deserialization kotlinx.serialization

比方说我上了一堂课:

@Serializable
data class MyClass(
    @SerialName("a") val a: String?,
    @SerialName("b") val b: String
)

假设anull并且b的值为“ b value”,则Json.stringify(MyClass.serializer(), this)产生:

{ "a": null, "b": "b value" }

基本上,如果anull,我想得到这个:

{ "b": "b value" }

从一些研究中,我发现Kotlinx序列化目前无法立即使用,因此我试图构建一个自定义序列化器以显式忽略null值。我遵循了here的指南,但无法做出正确的指南。

有人可以帮我一下吗?谢谢。

3 个答案:

答案 0 :(得分:2)

encodeDefaults = false中使用JsonConfiguration属性,它不会序列化null(或其他可选值)

答案 1 :(得分:1)

尝试一下(未经测试,仅基于修改示例):

@Serializable
data class MyClass(val a: String?, val b: String) {
    @Serializer(forClass = MyClass::class)
        companion object : KSerializer<MyClass> {
        override val descriptor: SerialDescriptor = object : SerialClassDescImpl("MyClass") {
            init {
                addElement("a")
                addElement("b")
            }
        }

        override fun serialize(encoder: Encoder, obj: MyClass) {
            encoder.beginStructure(descriptor).run {
                obj.a?.let { encodeStringElement(descriptor, 0, obj.a) }
                encodeStringElement(descriptor, 1, obj.b)
                endStructure(descriptor)
            }
        }

        override fun deserialize(decoder: Decoder): MyClass {
            var a: String? = null
            var b = ""

            decoder.beginStructure(descriptor).run {
                loop@ while (true) {
                    when (val i = decodeElementIndex(descriptor)) {
                        CompositeDecoder.READ_DONE -> break@loop
                        0 -> a = decodeStringElement(descriptor, i)
                        1 -> b = decodeStringElement(descriptor, i)
                        else -> throw SerializationException("Unknown index $i")
                    }
                }
                endStructure(descriptor)
            }

            return MyClass(a, b)
        }
    }
}

答案 2 :(得分:-1)

C::ValueType: Clone弃用,因为changelog根据其kotlinx.serialization 1.0.0-RC 推荐使用JsonConfiguration构建器

现在您必须这样编码:

Json {}