假设我有这样一个类:
@Serializable
data class MyClass(
@SerialName("a") val a: String?,
@SerialName("b") val b: String
)
假设a
是null
,而b
的值是“B值”,则Json.stringify(MyClass.serializer(), this)
产生:
{ "a": null, "b": "b value" }
基本上,如果a
是null
,我想得到:
{ "b": "b value" }
通过一些研究,我发现这在Kotlinx序列化中是不可实现的,所以我尝试构建一个自定义的序列化器来显式忽略null
值。我遵循了here的指导,但无法创建正确的序列化器。
谁能给我点光?谢谢。
6条答案
按热度按时间ffscu2ro1#
在
JsonConfiguration
中使用encodeDefaults = false
属性,它不会序列化空值(或其他可选值)isr3a4wc2#
您可以使用
explicitNulls = false
例如:
https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md#explicit-nulls
zd287kbt3#
尝试以下操作(未进行测试,仅基于对示例的调整):
tvokkenx4#
JsonConfiguration
已弃用,而支持Json {}
构建器,因为kotlinx.序列化 1.0.0-RC 已根据其更改日志进行。现在您必须编写如下代码:
vshtjzan5#
由于我也在为这个问题而挣扎,让我与您分享我发现的解决方案,它是每个属性的,不需要为整个类创建序列化程序。
将按预期方式与以下类一起工作
请注意,如果您在encodeDefaults = true的情况下使用JsonBuilder,则@EncodeDefault(EncodeDefault.Mode.NEVER)在这里是至关重要的,因为在这种情况下,除非使用此注解,否则即使id字段的值为空,序列化库仍将添加'id' json键。
mkh04yzy6#
到目前为止,对于今天看到这篇帖子任何人来说,默认值都没有序列化(请参见https:Kotlin#默认值不是编码的)。
因此,您只需添加以设置默认空值,它将不会被序列化。