JSON 转 Swift
暂无内容
免费在线 JSON 转 Swift 工具,把 API 响应、配置文件或日志 JSON 一键转成纯 Swift struct / class 类型声明。无注册、无上传,浏览器本地实时生成,适合 iOS、macOS、watchOS 与 tvOS 项目快速建模。
暂无内容
免费在线 JSON 转 Swift 工具,把 API 响应、配置文件或日志 JSON 一键转成纯 Swift struct / class 类型声明。无注册、无上传,浏览器本地实时生成,适合 iOS、macOS、watchOS 与 tvOS 项目快速建模。
JSON 转 Swift 是把 JSON 格式的数据(对象或数组)自动转换为 Swift struct / class 类型声明的过程。JSON 是 REST API、配置文件、埋点日志的事实标准,而 Swift 是 iOS、macOS、watchOS、tvOS 应用的主要开发语言,也是服务端框架如 Vapor 的核心语言。开发中经常需要把 API 返回的 JSON 写成对应的 Swift 类型,手写不仅耗时还容易遗漏可选字段,本工具的作用就是把这一过程自动化。
本工具使用 quicktype-core 在浏览器本地完成转换。quicktype 是一款支持多语言的结构生成器,本工具针对 Swift 启用 just-types 与 no-comments 选项,因此输出的是干净的 struct / class 属性声明,不包含 Codable、Decodable、Encodable 等序列化注解,也不包含 import 语句或文件头注释。这种「裸类型」方便开发者根据项目需要自由添加协议、调整访问控制,或改成 Alamofire / Moya 等网络框架偏好的命名约定。
Swift 的类型系统以安全著称。struct 是值类型,适合表示不可变数据;class 是引用类型,适合需要共享状态或继承的场景。本工具生成的属性会尽可能映射到 Swift 的 String、Int、Double、Bool、[T]、自定义类型等。开发者可以在生成后根据业务需求把某些字段改为 Optional(?)、给类型添加 Codable 协议,或者把整个 struct 升级为 class 以获得引用语义。
嵌套对象处理是工具的关键能力。当 JSON 包含嵌套对象时,工具会递归生成独立的子类型,例如 Root 包含 address 对象时会生成 Address 类型,主类型中通过 var address: Address 引用。这样避免了类型重复定义,也让 Xcode 的自动补全和类型检查能够正确追踪层级关系。命名规则采用字段名首字母大写,例如 users 数组中的元素会被命名为 User。
数组类型推断遵循「按首项元素推断」的策略。如果数组元素是字符串则生成 [String],是整数则生成 [Int],是浮点数则生成 [Double],是对象则生成 [自定义类型]。空数组 [] 由于缺乏样本,会生成 [Any] 或兜底类型,生成后建议根据实际业务改为具体类型。对于特别大的数组或稀疏数组,建议在源 JSON 中放入真实样本元素,提高推断准确度。
纯前端处理是本工具的核心架构优势。所有 JSON 解析与 Swift 代码生成都在浏览器 JavaScript(含 Web Worker 中的 quicktype-core)中执行,不依赖后端服务,也不向任何服务器发送数据。这种设计既保护了可能包含敏感信息的 JSON 数据,也保证了转换速度仅受本地设备性能限制,无需等待网络往返。对于处理含 API 密钥、未公开业务字段的 JSON 尤为重要。
本工具与一些强行绑定 Codable / CodingKeys / Date 解码策略的在线工具不同:快团队成员对协议、命名、访问控制往往有不同偏好,本工具坚持最小输出原则,把协议和策略选择留给开发者按项目需要再加工。这种「生成半成品 + 项目级二次加工」的工作流,在中大型团队中通常比「一键全包」更受工程师欢迎。
iOS / macOS 项目最常见的用法:把本工具生成的 struct 添加 Codable 后,用 URLSession 异步拉取并用 JSONDecoder 解码。
import Foundation
// 1) 本工具生成的根类型(补上 Codable 协议)
struct User: Codable {
let id: Int
let name: String
let email: String
let isActive: Bool
let tags: [String]
}
// 2) URLSession 异步获取并解码
func fetchUser(id: Int) async throws -> User {
let url = URL(string: "https://api.example.com/users/\(id)")!
let (data, response) = try await URLSession.shared.data(from: url)
guard
let http = response as? HTTPURLResponse,
(200..<300).contains(http.statusCode)
else {
throw URLError(.badServerResponse)
}
return try JSONDecoder().decode(User.self, from: data)
}
// 3) 使用示例(Swift 5.5+ async/await)
Task {
do {
let user = try await fetchUser(id: 42)
print("User: \(user.name), tags: \(user.tags)")
} catch {
print("Failed to decode:", error)
}
}使用 Alamofire 时,可以直接用 responseDecodable 把本工具生成的 struct 自动解码为 Swift 对象。
import Foundation
import Alamofire
// 本工具生成的类型,添加 Codable 后直接可用
struct Product: Codable {
let id: Int
let title: String
let price: Double
let inStock: Bool
let images: [String]
}
final class ProductService {
private let session: Session
init(session: Session = .default) {
self.session = session
}
/// Alamofire 5 async/await 风格的 responseDecodable
func loadProduct(id: Int) async throws -> Product {
let url = "https://api.example.com/products/\(id)"
return try await withCheckedThrowingContinuation { continuation in
session.request(url)
.validate(statusCode: 200..<300)
.responseDecodable(of: Product.self) { response in
switch response.result {
case .success(let product):
continuation.resume(returning: product)
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
}
// Moya 风格调用示例
// provider.request(.product(id: 1)).map(Product.self)
// let product: Product = try await provider.request(.product(id: 1)).map(Product.self)在 SwiftUI / Combine 项目里,可以把生成的 struct 与 dataTaskPublisher / decode 一起用,做响应式数据流。
import Foundation
import Combine
// 本工具生成的根类型
struct Article: Codable, Identifiable {
let id: Int
let title: String
let body: String
let publishedAt: Date
}
final class ArticleRepository {
private let session: URLSession
private var cancellables = Set<AnyCancellable>()
init(session: URLSession = .shared) {
self.session = session
}
/// 用 Combine 暴露数据流
func articlePublisher(id: Int) -> AnyPublisher<Article, Error> {
let url = URL(string: "https://api.example.com/articles/\(id)")!
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return session.dataTaskPublisher(for: url)
.map(\.data)
.decode(type: Article.self, decoder: decoder)
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
/// 在 SwiftUI ViewModel 中订阅
func bind(to viewModel: ArticleViewModel, articleId: Int) {
articlePublisher(id: articleId)
.sink(
receiveCompletion: { completion in
if case .failure(let err) = completion {
viewModel.errorMessage = err.localizedDescription
}
},
receiveValue: { article in
viewModel.article = article
}
)
.store(in: &cancellables)
}
}
final class ArticleViewModel: ObservableObject {
@Published var article: Article?
@Published var errorMessage: String?
}将 JSON 内容粘贴到左侧输入框,工具会在 400ms 防抖后自动调用 quicktype-core 转换为 Swift 代码,并在右侧面板实时显示结果。也可以点击上传按钮选择 .json / .txt 文件,或点击示例按钮加载内置数据。转换完成后可一键复制或下载为 .swift 文件。
默认不包含。本工具使用 quicktype-core 的 just-types 模式,输出的是纯 struct / class 属性声明,没有 Codable、Decodable 或 Encodable 注解,也不带 import 语句。如果你需要 Codable,只需要在生成后手动添加 : Codable(如 struct User: Codable {}),或自行编写 JSONDecoder 解析逻辑。
支持所有合法 JSON:基本类型(null、boolean、number、string)、一维或多维数组、任意深度的嵌套对象。根输入可以是 JSON 对象或 JSON 数组,工具会以对象优先、数组按首项推断的方式处理。不支持的输入包括 JavaScript 特殊值(函数、Symbol、undefined)以及非 JSON 文本。
工具会递归为每个嵌套对象生成独立的 Swift 类型。命名规则基于父类型名与字段名组合,如 Root 包含 address 字段时会生成 Address 子类型,主类型中通过 var address: Address 引用。这样避免了类型重复定义,也让 Xcode 的自动补全和类型检查能正确追踪层级关系。
会。JSON 数组会自动转换为 Swift [T] 形式。如果数组元素是字符串则生成 [String],是整数则生成 [Int],是浮点数则生成 [Double],是对象则生成 [自定义类型]。空数组 [] 由于没有样本元素,默认生成 [Any],建议生成后手动改为 [String] 或 [Int] 等具体类型。
JSON 中的 null 值无法推断具体类型,工具可能生成 Any 或兜底类型。建议把源 JSON 中值为 null 的字段替换为示例值(如 "field": "" 推断为 String)或根据业务手动改为 Optional(如 var phone: String?),这样更符合 Swift 类型系统的安全语义。
可以。在工具栏点击类型名称按钮(或设置入口),即可修改根类型名称(默认如 Root 或根据示例数据推断)。子类型命名会基于根名称和字段名自动生成,命名规则是字段名首字母大写,例如 users → User、tags → Tag。
工具会自动检测 JSON 合法性,错误时会在右侧显示具体错误提示,并提供「修复 JSON」按钮。点击后可自动修复常见错误:末尾多余逗号、单引号替换为双引号、缺失引号的 key 补全、注释移除等。修复成功后即可继续转换,无需手工改 JSON。
完全本地浏览器运行。所有 JSON 解析、Swift 代码生成都通过浏览器 JavaScript(含 Web Worker 中的 quicktype-core)在本地完成,输入的 JSON 数据和生成的 Swift 代码不会被上传到任何服务器,也不会被记录或缓存到云端。包含 API key、token、用户隐私字段、未上线业务结构等敏感 JSON 都可以放心使用,关闭页面即清除。
可以。生成的代码是标准 Swift 语法,可直接复制到 Xcode 的 .swift 文件中,或通过「下载」按钮保存为 .swift 文件拖入项目。由于输出为纯类型声明,建议根据项目需要手动添加 Codable、Equatable、Identifiable 等协议,或者调整访问控制修饰符(public / internal / private)。
支持。当根输入是 JSON 数组时,工具会以数组第一个元素为模板生成元素类型,并输出该元素类型定义。例如 [{"id":1,"name":"A"}] 会生成名为 Item 的 struct(或基于字段推断的名字),其字段就是第一个元素的字段;主类型通过 property items: [Item] 引用,避免直接把数组当根类型。
工具没有显式大小限制,但浏览器对超大 JSON 的解析与渲染会变慢。建议:① 一次只转换一个业务模块的 JSON;② 嵌套层级过深时拆分层级处理;③ 超过数 MB 的 JSON 可使用命令行版的 quicktype 处理;④ 把同一个 JSON 拆分成多个子模块分别转换可显著降低内存占用。
两者都是把 JSON 转为对应语言的类型定义,但侧重点不同:JSON 转 Swift 生成 struct / class 属性声明,用于 iOS / macOS 原生应用;JSON 转 TypeScript 生成 interface / type 声明,用于前端类型检查。如果你的项目同时有 iOS 客户端和 Web 前端,建议对同一份 JSON 分别生成 Swift 与 TS 两个版本,保证两端类型一致。
本工具默认输出纯类型,不直接带协议。生成后你只需要在 struct/class 声明后追加 : Codable,例如 struct User: Codable {},即可让 JSONDecoder 使用。如果你希望默认带 Codable,可以 fork quicktype-core 并修改其 Swift 渲染器,或在生成后用 Xcode 的批量替换功能给所有类型加上协议。
首次访问页面时需要联网拉取工具脚本和 quicktype-core 资源,之后可在浏览器缓存中离线运行(在已访问过的浏览器中)。移动端浏览器(iOS Safari、Android Chrome)也能正常使用,界面为响应式分屏设计,竖屏时会自动切换为上下堆叠。
支持。生成后每个 Swift 类型都是独立 struct / class,工具的输出是纯文本,你可以单独复制某一个类型粘贴到 Xcode,或在 Xcode 中用 Rename 重构批量修改类型与字段而不影响其它类型。如果需要重新生成整组类型,刷新页面后再次粘贴 JSON 即可。
quicktype 对 union/枚举的支持需要额外的 type hints 或 GraphQL/JSON Schema 输入。仅基于 JSON 样本难以推断枚举,因此本工具默认不会生成 enum。如果你需要枚举,可以手动把对应 struct 改为 enum + Codable,或改用 JSON 转 Kotlin / TypeScript 工具先得到 enum 类型,再手动迁移到 Swift。
左侧输入框为空或只有空白字符。请粘贴有效的 JSON 内容,或点击「示例」加载样例,或点击「上传」选择 .json / .txt 文件。
JSON 格式不合法。常见原因:① 末尾有多余逗号(如 {"a":1,});② 用了单引号而非双引号;③ JS 对象写法(如 {key: value})而非 JSON(如 {"key": "value"});④ 含 JavaScript 注释。点击「修复 JSON」按钮可自动修复部分常见错误。
这是预期行为。本工具使用 just-types 模式,输出纯 struct / class 属性声明。如需 Codable,请在生成后给类型添加 : Codable(如 struct User: Codable {}),或写 extension User: Codable {} 后再调用 JSONDecoder。
空数组没有样本元素,工具会生成兜底类型 [Any]。建议在源 JSON 中至少放入一个示例元素(如 [1, 2]),生成后再删除示例值,并手动指定具体类型;或在生成后直接改为 [String] / [User] 等更精确的类型。
JSON null 无法推断具体类型,工具可能生成 Any 或兜底类型。建议把源 JSON 中的 null 替换为代表性示例值(如 "" 或 0),生成后再把该字段改为 Optional(?)或具体类型,例如 var phone: String?。
可在工具栏修改根类型名称,子类型名会基于根名称 + 字段名自动生成。如果仍不满意,生成后在 Xcode 中使用 Rename 重构批量修改(右键 → Refactor → Rename),Xcode 会同步更新所有引用。
浏览器渲染超大 JSON 和生成大量类型时会变慢。建议把 JSON 拆分成多个独立业务模块分别转换,或仅提取需要建模的关键对象进行转换;超过 10MB 的 JSON 推荐使用命令行版的 quicktype 处理。
说明你给某些字段加 Codable 后,没有正确处理 Optional / Date / Enum 等类型。常见修复:① 把所有可能为 null 的字段改为 Optional<T>;② 自定义日期策略 JSONDecoder().dateDecodingStrategy = .iso8601;③ 自定义 CodingKeys 让 JSON key 与 Swift 属性名一致。
本工具默认保留 JSON 原字段名,因此 snake_case 字段会原样生成。若想统一为 camelCase,可在生成后用 Xcode Rename 批量重命名,或在自定义 quicktype 渲染器中将字段名转换为 camelCase,再补充 CodingKeys 映射,保证 JSON 解码正确。
Swift 推荐字段名为英文 ASCII 标识符。若源 JSON 含中文 key(如 {"姓名": "Alice"}),生成的 var 姓名: String 会让 Swift 编译器对部分历史版本报错。建议在源 JSON 中把 key 改为英文(如 name),更符合 Swift 编码规范。
本工具默认生成 var public 属性,方便生成后再加工。如需 let 或访问控制(如 private(set)),可在 Xcode 中使用 Refactor → Add Access Control 批量修改,或在生成后用 sed / 文本编辑工具替换 var 为 let。
本工具默认把 ISO 8601 字符串映射为 String,Swift 不会自动转换为 Date。需要在 JSONDecoder 中设置 dateDecodingStrategy,例如 JSONDecoder().dateDecodingStrategy = .iso8601。如果日期格式非标准,还需手动实现 DateFormatter 或自定义解析逻辑。
工具以「字段名首字母大写」为子类型命名。深嵌套 JSON 中可能出现同名嵌套对象导致类型冲突。解决方法:① 在源 JSON 中给字段加上业务前缀;② 把根 JSON 拆分为多个独立模块分别生成;③ 生成后用 Xcode Rename 批量修改冲突的类型名。
本工具默认生成 internal struct,没有显式 public 修饰符。如果项目按 module 拆分且需要跨模块访问,需要在 Xcode 中批量替换 struct 为 public struct,或在生成后用 sed/awk 脚本统一加 public 关键字。
工具根据 JSON 值的形式自动推断对应的 Swift 类型:
| JSON 值示例 | 判断方法 | 生成 Swift 类型 | 说明 |
|---|---|---|---|
null | value === null | Any? 或具体 Optional | 无法推断具体类型,生成后建议手动改为 Optional<T> |
true / false | typeof value === 'boolean' | Bool | 直接映射为 Swift 布尔类型 |
42 | typeof value === 'number' && Number.isInteger(value) | Int | 整数映射为 Int(32/64 位由平台决定) |
3.14 | typeof value === 'number' && !Number.isInteger(value) | Double | 浮点数映射为 Double |
"hello" | typeof value === 'string' | String | 字符串映射为 String |
[] (空数组) | Array.isArray(value) && value.length === 0 | [Any] | 无法推断元素类型,建议补充示例或手动修改为具体类型 |
["a", "b"] | Array.isArray(value) && typeof value[0] === 'string' | [String] | 字符串数组 |
[1, 2, 3] | Array.isArray(value) && typeof value[0] === 'number' | [Int] | 整数数组 |
[1.5, 2.5] | Array.isArray(value) && typeof value[0] === 'number' && !Number.isInteger(value[0]) | [Double] | 浮点数组 |
[{...}, {...}] | Array.isArray(value) && typeof value[0] === 'object' | [Item] | 对象数组,元素为自定义类型,命名按字段名推断 |
{...} (嵌套对象) | typeof value === 'object' && !Array.isArray(value) | 独立 struct / class | 递归生成独立类型,命名按字段名首字母大写 |
生成的 Swift 类型可以直接用于 Apple 平台 / 第三方框架的不同场景:
| 使用场景 | 常用框架 | 需要补充的协议 / 处理 | 典型代码片段 |
|---|---|---|---|
REST API 解析 | URLSession + JSONDecoder | 为类型加 Codable,保持 struct 值语义 | try JSONDecoder().decode(User.self, from: data) |
简化 HTTP 请求 | Alamofire | 为类型加 Codable,配合 responseDecodable | session.request(url).responseDecodable(of: User.self) |
抽象网络层 | Moya | 为类型加 Codable,Moya 自动反序列化 | provider.request(.user(id: 1)).map(User.self) |
响应式数据流 | Combine + JSONDecoder | 为类型加 Codable,结合 dataTaskPublisher | URLSession.shared.dataTaskPublisher(for: url).decode(type: User.self, decoder: decoder) |
SwiftUI 列表展示 | SwiftUI List + Identifiable | 为类型加 Identifiable,让 List 自动 forEach | List(items) { Text($0.name) } |
服务端模型定义 | Vapor | 为类型加 Codable,Vapor 自动 Content 序列化 | struct User: Codable, Content { var id: Int; var name: String } |
本地持久化模型 | SwiftData / Core Data | 在生成 struct / class 上加 @Model / @NSManaged | @Model class User { var id: Int; var name: String } |
跨端类型共享 | JSON 转 Swift + JSON 转 TypeScript 配合 | 保持 Swift 与 TS 字段名一致,TS 端配合 TS 类型 | Swift: var name: String / TS: name: string |
本 JSON 转 Swift 工具所有 JSON 解析、Swift 类型生成操作完全在你的浏览器本地通过 JavaScript(quicktype-core / Web Worker)完成,输入的 JSON 数据和生成的 Swift 代码都不会被上传到任何服务器,也不会被记录、缓存或存储到云端。包含内部接口字段、API key、token、用户隐私数据、未公开业务结构的敏感 JSON 都可以放心使用,关闭或刷新页面后所有输入和输出内容自动从内存清除,不依赖任何第三方网络服务。