JSON 转 Swift Codable, 粘 JSON 出遵循 Codable 的 struct 或 class, camelCase 属性, key 不匹配时生成 CodingKeys 枚举, 可空字段用 Optional T?, 嵌套类型。
- 本地处理
- 分类 开发运维
- 适合 格式化、校验、压缩或检查和代码相关的文本。
类型、CodingKeys 和 Optional 是怎么推断的
每个 JSON 对象生成一个遵循 Codable 的 Swift 类型, 属性用 camelCase; 嵌套对象抽成自己的命名类型 (User.address → UserAddress)。当 Swift 属性名跟原始 key (snake_case、kebab-case、保留字) 不一致时, CodingKeys 枚举会把属性映射回原始 JSON key, 让 JSONDecoder 正确往返。当所有 key 都已经匹配时, CodingKeys 枚举会省略 —— Swift 会自动合成 (打开"总是生成 CodingKeys"可以把契约写出来留档)。整数推断成 Int; 带小数的推断成 Double; 一个数字有时是整数有时带小数, 字段会放宽到 Double。对象数组会折叠成一个类型 —— 某些元素缺的 key (或值为 null) 会变成 Optional (T?)。只出现过 null 的值推断成 AnyCodable? —— Swift 的 Any 不是 Codable, 所以输出会标出一个占位符, 你用自己的类型擦除包装替换。可切换 struct↔class 和 let↔var 匹配你的模型风格。
这个工具能做什么
把任意 JSON (URLSession 响应、Vapor 路由 body、Firebase 文档、第三方 REST API) 粘进来, 拿到一组遵循 `Codable` 的 Swift 类型, 可以直接拖进 `.swift` 文件、用 `JSONDecoder` 解码。属性默认生成成 `let` (不可变, 解码 模型的合适选择), 也可切换成 `var`; JSON 的 key 会转成合法标识符 (`site_admin` 变成 `siteAdmin`、`created_at` 变成 `createdAt`、`first-name` 变成 `firstName`), 类型名转成 PascalCase。当 Swift 属性名跟原始 key 不一致 时, 会生成一个 `CodingKeys: String, CodingKey` 枚举把属性映射回精确的 JSON key, 让 `JSONDecoder` 不用自定义 `keyDecodingStrategy` 也能正确往返; 当所有 key 都已经匹配时, 枚举会省略, 由 Swift 自动合成。如果你想把线上契约写进 类型里留档, 打开"总是生成 CodingKeys"即可。数字不会被一锅端: 整数样本推断成 `Int`, 带小数的推断成 `Double`, 一个字段在一个样本里是整数、另一个里带小数会 放宽到 `Double`。可空性严格按 Swift 的 `Optional` 来。在 JSON 数组某些元素 里缺失、或出现过 JSON `null` 的 key 变成 `T?`, 只出现过 null 的值会以 `AnyCodable?` 出现并附说明, 因为 Swift 的 `Any` 不是 `Codable`。对象数组会 折叠成一个共享类型, 所以 `[{"a":1},{"a":1,"b":2}]` 出来是一个同时带两个字段 (`b` 可空) 的 struct, 而不是两个几乎重复的类型。嵌套对象会抽成自己的命名类型 (`User.address` 变成 `UserAddress`), 可以把 `struct` 切成 `class` 匹配引用 语义模型, `default` 这类保留字 key 会用反引号转义, 保证输出永远能编译。全部 在浏览器里跑。JSON 不碰服务器。
工具细节
- 输入
- 文本 + 数值 + 结构化内容
- 页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
- 输出
- 即时结果 + 复制 + 下载
- 结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
- 隐私
- 浏览器本地处理
- 主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
- 保存 / 分享
- 可分享链接状态
- 关键设置会进入 URL,复制链接后别人能复现同一组参数。
- 性能预算
- 首屏 JS ≤ 25 KB
- 没有声明 WASM 依赖,适合快速打开和移动端使用。
- 适用场景
- 开发运维 · 程序员
- 分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。
怎么用
-
1. 输入
把内容粘贴或拖入工具面板。
-
2. 处理
点击按钮,在浏览器内本地处理,文件不上传。
-
3. 复制 / 下载
一键复制结果或下载到本地。
JSON 转 Swift Codable 适合怎么用
适合穿插在写代码、查问题、做 Review、上线前的小任务里。
适合开发场景
- 格式化、校验、压缩或检查和代码相关的文本。
- 把片段整理好再放进文档、工单、提交或交接材料。
- 不切换工具,快速检查一个小 payload。
开发检查项
- 压缩、混淆这类不可逆处理,先对副本操作。
- 除非确认工具本地处理,不要粘贴密钥和敏感片段。
- 转换后的代码上线前,仍要跑自己的测试或 lint。
下一步可以接着做
这些入口会把当前任务接到更完整的工具链里。
- 1 JSON 转 Kotlin 数据类 JSON 转 Kotlin data class, 粘 JSON 出 val 属性, camelCase 字段, 可空 T?, 嵌套类, 带 kotlinx.serialization @SerialName、Gson @SerializedName 或 Moshi @Json 注解。 打开
- 2 JSON 转 TypeScript Interface JSON 转 TypeScript interface, 粘 JSON 出干净 interface, 数组元素合并为 union, 可选字段自动识别, 根类型名可命名。 打开
- 3 JSON 转 Java 类 JSON 转 Java POJO、record 或 Lombok @Data, 粘 JSON 出 camelCase 字段, 带 getter/setter, Jackson @JsonProperty 或 Gson @SerializedName, 嵌套类, 基本类型与装箱推断。 打开
真实使用场景
接 URLSession 响应时不再手写 model
你在 iOS app 里解码一个第三方 REST API, 响应有 25 多个字段, 是 snake_case。curl 一次, 把 JSON 粘进来, 根名设为 `OrderResponse`, 保持 struct + let。每个 `created_at` 这样的 key 都会进 `CodingKeys`, 让 `JSONDecoder` 绑得上, 嵌套对象抽成自己的类型, 可选字段变成 `T?`。把 输出放进 `OrderResponse.swift`, 调 `try JSONDecoder().decode(OrderResponse.self, from: data)`, 你就拿到一个 完全类型化的结果, 而不是用强转在 `[String: Any]` 里挖、运行时崩。
给 Vapor 路由写请求和响应模型
你在写一个 Vapor 后端, 需要给新 endpoint 弄遵循 `Content` 的模型。粘进 请求 body 样例, 根名 `CreateOrderRequest`, 保持 struct。你拿到一个 `Codable` struct, 任何 snake_case key 都配好了 `CodingKeys`; 在声明上 加 `: Content`, Vapor 就能把请求 body 直接解码进去。打开“可选属性默认 = nil”, 缺失的可选字段不会破坏构造, payload 变大时模型保持向前兼容。
看清 API 里到底哪些字段是可选的
某 endpoint 有时带 `cancelled_at`, 有时不带。把几次响应记下来, 作为 JSON 数组粘进来, 数组折叠的检测会标出 `cancelled_at` 在某些元素里缺失, 于是它变成 `String?`, 而不是一个解码时抛 `keyNotFound` 的非 Optional 字段。在视图代码里做个 `if let cancelledAt`, 现在就能干净地区分 "已取消"和"仍有效", 而不是 key 一缺失就崩。
把 [String: Any] 换成真正的 Codable 类型
老 Swift 代码是 `let json = try JSONSerialization.jsonObject(...) as? [String: Any]`, 然后用 `json?["id"] as? String` 一层层挖, 丢掉了所有编译期检查, key 打错还会悄悄返回 nil。抓一个有代表性的响应粘进来, 生成 struct, 用 `JSONDecoder` 解码。现在 `Int`、`Double` 在每个字段上都推断好了, Optional 是显式的, 改个 key 名编译期就会报错, 而不是上线后返回 nil。
给共享且可变的对象生成 class 模型
你有一个在多个 SwiftUI 视图间共享、就地修改的模型, 引用类型才合适。 把 JSON 粘进来, 把 struct 切成 class、let 切成 var, 你就拿到一个 `class: Codable`, 属性是可变的 `var`。配上 `@Observable` (或 `ObservableObject`), 同一个解码类型直接驱动视图状态, 不用再维护一个 单独的 view model 样板。
常见踩坑
粘一个对象进来然后期待某些字段是 Optional。单个对象没有“key 缺失”信号, 所以除非值本身就是 null, 否则每个字段都是非 Optional 的。Optional 推断只在“JSON 数组”里生效 (有的元素带某个 key、有的不带)。想从一个样本探索可选性, 把它包成 `[{...}]`。
把金额或需要精确小数的字段留成 `Double`。工具对任何带小数的数字都推断成 `Double`, 但 `Double` 是二进制浮点, 会把 0.1 或货币总额这类值表示错。金额请在生成后改成 `Decimal`。JSON 不带“这个数字需要精确十进制精度”的信号。
删掉某个 CodingKeys case 还指望解码照常工作。这个枚举正是把 `site_admin` (线上) 映射到 `siteAdmin` (属性) 的东西。删了 case, JSONDecoder 会去找根本不存在的 `siteAdmin` key, 抛 keyNotFound。要么留着 case, 要么全局设 decoder.keyDecodingStrategy = .convertFromSnakeCase 而不是每个类型写 CodingKeys。
把 AnyCodable 占位符原样发出去。只出现过 null 的字段会推断成 `AnyCodable?`, 而 `AnyCodable` 不是 Swift 内建类型, 输出会在注释里标出来。要么加一个类型擦除包装 (常用的是 Flight-School/AnyCodable 包), 要么在知道真实形状后换成具体的 `T?`。
隐私说明
你粘进来的 JSON 不会离开这个浏览器标签页。解析和类型推断走浏览器内建的 `JSON.parse`, 没有任何网络请求, 也不对文本框内容做 analytics。分享链接会把 你的输入和根类型名编码进 URL 以便复现结果, 也就是说由你决定何时分享。如果 payload 敏感 (内部 ID、客户数据、生产响应), 直接复制生成的 Swift 代码, 不要 分享链接。只有选项 (struct 还是 class、let 还是 var、CodingKeys 和 = nil 开关) 会存进 localStorage, 让你偏好的风格在多次访问之间保留。
常见问题
类似工具组合
做你这行的人, 还会一起用这些。