KT

JSON 转 Kotlin Data Class

生成嵌套 Kotlin Data Class、可空默认值与 kotlinx/Jackson 注解

JSON 与数据
🔒 100% 本地运行 — 你的数据不会离开当前页面
由 Evan 维护•最近更新:2026年9月30日
JSON → Kotlin classes

根据样本推断,不是完整 API 契约。字段缺失与显式 null 分别推断,输出类型可能合并两者;数组内的 null 单独保留可空性。重复键和会改变数值的输入会报错。

上限:1 MiB、64 层、20,000 个值、200 个模型、2,000 个模型字段。精确大整数或金额请用字符串。

目标:Kotlin 2.1+。kotlinx 模式需要 serialization 编译插件及 JSON 运行库;Jackson 模式需要 jackson-module-kotlin。混合值使用对应 JSON 节点类型。键名最多 16,000 个 UTF-16 码元;构造参数按 JVM 槽位上限检查。kotlinx 重新编码时用 Json { encodeDefaults = true } 保留显式 null;Jackson 模式拒绝空键。

Kotlin classes

生成后请在目标项目编译,并用代表性响应验证反序列化。

工具说明

JSON 转 Kotlin Data Class 推断 Kotlin 2.1+ 模型,可选择 kotlinx.serialization、Jackson 或无注解模式。数组可空元素有自己的问号,与字段自身可空分别处理。kotlinx 模式中,混合值使用 JsonElement,不使用无法直接序列化的 Any;空对象生成可序列化普通类,因为 Data Class 至少需要一个构造属性。SerialName 字符串内的美元符号与特殊字符会按原 JSON 键转义。Jackson 模式同时生成构造参数和 getter 映射,需要 jackson-module-kotlin,并拒绝空键,因为空 JsonProperty 注解选择默认名称。可选字段的 null 默认值允许缺失字段解码;只有确实需要拒绝缺失构造参数时才关闭。kotlinx 重新编码若需保留显式 null 字段,应配置 Json { encodeDefaults = true };仅靠可空模型无法恢复缺失与 null 的出现历史。输入仅在本地处理,上限为 1 MiB、64 层、20,000 个值、200 个模型与 2,000 个字段。重复键、无效 Unicode、不安全整数和改变数值的转换都会报错。请在目标项目配置所选运行库与编译插件,验证响应后再细化日期、枚举或金额类型。 JSON 键最多 16,000 个 UTF-16 码元,生成标识符会先缩短至 80 字符再加后缀。JVM 参数检查计入自动生成的默认值掩码:单个 Data Class 最多可容纳 124 个非空 Long/Double 字段,或 245 个引用字段。

场景配方

01

解码含字面键名的 Kotlin 可空列表

目标:模型保留字面键名,列表允许 null 元素。

  1. 粘贴 {"$value":[1,null,2]},选择 kotlinx.serialization。
  2. 确认 SerialName 转义了美元符号,类型为 List<Long?>。
  3. 配置 serialization 编译插件与 JSON 运行库,解码后核对中间元素为 null。

结果:模型保留字面键名,列表允许 null 元素。

失败门诊(高频踩坑)

字段可空,缺失时却抛异常

原因:没有默认值的可空构造参数仍可能是序列化器的必填项。

修复:对推断为缺失的字段保留 null 默认值,或在应用中明确要求并测试字段出现。

JSON 键中的美元符号触发 Kotlin 插值

原因:Kotlin 字符串模板会解释未转义的美元符号。

修复:使用生成器转义后的 SerialName,并在序列化测试中核对原始键。

生产可用片段

保留美元符号键与可空元素

kotlin

// Input: {"$value":[1,null,2]}
@Serializable
data class ApiResponse(
    @SerialName("\$value")
    val value: List<Long?>
)
// Imports: kotlinx.serialization.Serializable and SerialName

常见问题

为什么空对象生成普通类?

Kotlin Data Class 必须有构造属性。可序列化空普通类能够表示 {},不必人为添加字段。

为什么混合值使用 JsonElement?

kotlinx 编译插件不能为任意 Any 推断序列化器。JsonElement 可在领域类型确定前保留支持的 JSON 值。

为什么编码后 null 字段消失?

kotlinx 默认编码器可能省略等于 null 默认值的字段。使用 Json { encodeDefaults = true } 保留默认值字段,同时接受原本缺失的字段也可能写成 null。

Jackson 模式需要 Kotlin 模块吗?

需要。必须配置 jackson-module-kotlin 处理 Kotlin 构造函数;生成注解不会安装或注册模块。

继续浏览