You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:18:15