比方说我上了一堂课:
@Serializable
data class MyClass(
@SerialName("a") val a: String?,
@SerialName("b") val b: String
)
假设a
为null
并且b
的值为“ b value”,则Json.stringify(MyClass.serializer(), this)
产生:
{ "a": null, "b": "b value" }
基本上,如果a
是null
,我想得到这个:
{ "b": "b value" }
从一些研究中,我发现Kotlinx序列化目前无法立即使用,因此我试图构建一个自定义序列化器以显式忽略null
值。我遵循了here的指南,但无法做出正确的指南。
有人可以帮我一下吗?谢谢。
答案 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 {}