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 都可以放心使用,關閉或重新整理頁面後所有輸入和輸出內容自動從記憶體清除,不依賴任何第三方網路服務。