JSON 转 Kotlin Data Class
生成嵌套 Kotlin Data Class、可空默认值与 kotlinx/Jackson 注解
根据样本推断,不是完整 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 模式拒绝空键。
生成后请在目标项目编译,并用代表性响应验证反序列化。
工具说明
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 个引用字段。
场景配方
解码含字面键名的 Kotlin 可空列表
目标:模型保留字面键名,列表允许 null 元素。
- 粘贴 {"$value":[1,null,2]},选择 kotlinx.serialization。
- 确认 SerialName 转义了美元符号,类型为 List<Long?>。
- 配置 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 构造函数;生成注解不会安装或注册模块。
继续浏览