如何在kotlinx JSON.stringify中忽略Null值?
当然可以实现!kotlinx.serialization 提供了明确的配置来忽略序列化时的 null 字段,我给你两种常用的实现方式:
方法一:全局配置(所有 null 字段都忽略)
创建一个自定义的 Json 实例,设置 encodeDefaults = false。这个配置的核心作用是:仅序列化值不等于默认值的字段,而可空类型的默认值就是 null,所以所有为 null 的字段都会被自动忽略。
示例代码:
import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @Serializable data class User( val username: String, val email: String?, val age: Int? ) fun main() { val user = User("ligi", null, 30) // 配置忽略默认值(包括 null) val json = Json { encodeDefaults = false } val result = json.encodeToString(user) println(result) // 输出: {"username":"ligi","age":30} }
方法二:单个字段配置(仅忽略指定字段的 null 值)
如果你只想让特定字段在为 null 时不被序列化,可以使用 @EncodeDefault(EncodeDefault.Mode.NEVER) 注解标记该字段。这种方式不需要修改全局的 Json 配置,灵活性更高。
示例代码:
import kotlinx.serialization.Serializable import kotlinx.serialization.EncodeDefault import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @Serializable data class User( val username: String, @EncodeDefault(EncodeDefault.Mode.NEVER) val email: String?, // 这个字段为 null 时会被忽略 val age: Int? // 这个字段为 null 时仍会被序列化(默认行为) ) fun main() { val user = User("ligi", null, null) val result = Json.encodeToString(user) println(result) // 输出: {"username":"ligi","age":null} }
补充说明
- 默认的
Json实例是encodeDefaults = true,所以会序列化所有可空字段的null值,这就是你之前看到"field":null的原因。 - 如果字段有自定义默认值(比如
val age: Int? = null),设置encodeDefaults = false后,不管是显式赋值null还是使用默认值,该字段都不会被序列化。
内容的提问来源于stack exchange,提问作者ligi
相关产品推荐
相关产品推荐

