类型生成

JSON 转 Swift从接口样本生成 Codable 模型

示例包含字段缺失与 null,可直接观察可选属性如何形成。

JSON 转 Swift

JSON 输入

解析与生成均在当前浏览器内完成,输入不会上传或存储。

生成的源码

生成选项

Int64 / Decimal;实测 Swift 6.3.1、macOS 26。使用 makeJSONDecoder(),其他部署系统需复测。

根数组样本定义元素 Root;请解码 [Root].self。

2 个结构体 · 2 个可选属性

JSON 转 Swift 适合从接口响应整理模型初稿。不要只放一条字段齐全的记录:把缺少字段的记录也放进数组,推断才能发现可选属性。

生成的 Swift 结构体包含 Codable 模型及 CodingKeys。样本只能描述已见数据,无法代替接口协议中的必填约束、枚举或业务校验。

为什么使用 JSON 转 Swift?

把不同记录放在一起看

JSON 转 Swift 会合并同一数组位置的所有对象。某个键在其他样本中缺失,或值出现 null,就生成可选属性;始终存在的确定类型继续保持非可选。

两张样本对象卡片合并为模型,空心字段槽表示推断出的可选属性。

日期转换由你决定

默认保留日期字符串。开启 ISO 推断后,符合完整时间及时区条件的字符串才连接到 Date 属性与解码辅助函数,其余字符串保持原类型。

时间字符串卡片分别连接到保留字符串和时钟,突出日期转换是可选择的路径。

先确定模型如何读取数据

01

补齐反例样本

根输入接受对象或非空对象数组。根数组生成的是元素模型,应解码 [Root].self。嵌套数组也会读取所有元素,不会仅根据第一条记录决定字段。

02

检查映射与时间

原键含下划线、标点或保留字时,请保留 CodingKeys。保留名称模式尽量沿用合法标识符,camelCase 模式统一驼峰命名。日期推断要求时区及最多三位小数秒。

03

确认替换再导出

编辑后等待 350 毫秒自动生成;关闭自动模式可用按钮或 Ctrl/Cmd+Enter。输入或选项变化立即禁用过期结果导出。示例和清空先展示替换字符数,应用后可撤销一次。

源码里有哪些行为

完整的结构体与辅助类型

JSON 转 Swift 输出同一文件中的 var 属性和 Codable 结构体。非空嵌套对象有独立辅助模型;空对象使用字典;混合数据使用自包含的递归 JSONValue 枚举,避免 Any 无法合成 Codable 的问题。

直接读取原始数字

全部为整数写法且处于有符号 64 位范围的数字组使用 Int64。小数、指数、超范围整数及包含这些样本的数字组使用 Foundation.Decimal。浏览器不会先将数字转成 JavaScript Number 再推断。

可选属性遵循合成规则

默认只把样本缺失或为 null 的属性设为可选,也可选择全部可选。Swift 合成解码将缺失与 null 都读成 nil,编码通常省略 nil 属性,不能通过该值恢复两者区别。

带上正确的解码设置

makeJSONDecoder() 保持默认键策略;有 Date 时依次使用带与不带小数秒的 ISO8601DateFormatter,也适用于嵌套日期。需要重新编码为 ISO 文本时,应另行设置编码器日期策略。

接入项目之前的边界

样本推断不等于接口校验
不处理 JSON Schema、OpenAPI,也不猜测枚举、生成 class、Core Data、SwiftData 或请求代码。合成解码忽略未知键。日期推断会检查日历,但导出的日期辅助函数不是业务日期校验器。
采用保守数字预算
去掉首尾零后最多 38 位有效数字;原始指数为 −128 至 127;原始指数减小数位数不得低于 −128;正规化数量级不超过 127。混合数据及零的原始写法也接受这些检查,超出就报错,不尝试舍入。
真实运行环境仍要核验
编译与数值往返实测使用 Swift 6.3.1、macOS 26,并检查 Swift 5 语言模式;这不代表运行过旧编译器。旧版 Foundation 可能损失 Decimal 精度,请在部署目标复测。1.0 与 1e0 等数字写法不会保留。
Date 只保留时间点
只有合法完整时间、明确时区及零至三位小数秒才可能推断为 Date,同一位置的全部非空字符串都必须符合。纯日期、无时区、非法日期及更高精度仍为 String。原时区和格式不会保留,编码日期需独立配置。推断仅接受 1583–9999 年,更早时间保留 String,避免历史日历偏移;生成的辅助函数也拒绝 1583 年之前的年份。
键名必须能够区分
关闭 CodingKeys 后,任何需要改名的键都会报错。关键字、名称冲突及 CodingKeys 属性名会安全改名。键和值中的孤立代理字符不被接受;同一对象或合并模型中 NFC 规范等价的不同键也被拒绝,例如 é 与 e 加组合重音。
严格解析并限制规模
不支持注释、尾逗号、重复键、自动修复、文件导入、URL 请求或浏览器执行 Swift。限制为 500,000 输入字符、50,000 节点、40 层深度、每个合并对象 100 字段、200 结构体、每键或数字 1,000 字符、1,000,000 输出字符。

JSON 转 Swift 常见问题

生成的 Swift 代码包含 Codable 吗?

包含。每个生成结构体都遵循 Codable,混合值也使用可编码枚举。JSON 转 Swift 同时生成 makeJSONDecoder();按根对象或根数组选择 Root.self 或 [Root].self,并保留默认键策略。

支持哪些 JSON 数据结构?

根节点支持对象或非空的纯对象数组。嵌套对象生成辅助结构体,嵌套数组合并全部元素;空对象变成字典,空数组或混合数据用 JSONValue 表达不确定类型。

JSON 键名与 Swift 属性名不一致怎么办?

开启 CodingKeys 即可保留原键映射。驼峰模式会调整名称,保留模式尽量沿用合法名称;保留字、特殊字符和冲突会改名并加后缀。关闭映射但仍需改名时会明确报错。

为什么缺失字段和 null 都解码成 nil?

这是 Swift 合成 Codable 的默认语义:可选属性通过 decodeIfPresent 读取,缺失和 null 都成为 nil,编码通常省略该属性。若协议需要区分缺失、空值和实际值,应自行编写解码逻辑。

怎样解析 JSON 小数而不先经过 Double?

此页直接读取无损数字词法,按预算选择 Int64 或 Decimal,混合值中的数字也使用 Decimal。已在 Swift 6.3.1/macOS 26 做独立数值比较;旧 Foundation 行为不同,仍需在实际部署系统验证。

发现需要改进的推断情况?

用真实接口反例验证模型

用 JSON 转 Swift 整理含缺失字段、null 和实际数值的样本,再将下载的源码放进目标工程编译和解码。