JSON 轉 Swift
暫無內容
免費線上 JSON 轉 Swift 工具,把 API 回應、設定檔或紀錄 JSON 一鍵轉成純 Swift struct / class 類型宣告。無註冊、無上傳,瀏覽器本機即時生成,適合 iOS、macOS、watchOS 與 tvOS 專案快速建模。
相關推薦
關於 JSON 轉 Swift:把 JSON 資料變成 Apple 生態原生類型
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 開發:把後端 REST API 回傳的 JSON 轉成 Swift struct,用於 SwiftUI 或 UIKit 網路層建模與 JSONDecoder 解碼
- macOS 開發:把應用設定 JSON 轉成 Swift 類型,在 AppKit 專案中做類型安全的設定讀取,避免拼寫錯誤
- watchOS 開發:為 Apple Watch 應用把健康、運動資料 JSON 轉成 Swift 模型並接入 SwiftUI 與 HealthKit
- tvOS 開發:把內容推薦介面 JSON 轉成 Swift 類型,用於電視應用首頁資料展示與焦點導航
- SwiftUI MVVM 建模:把 API 資料模型直接作為 @Published 屬性綁定到 ViewModel,再驅動介面檢視
- Combine 響應式資料流:將 JSON 回應類型作為 Publisher 的輸出類型,配合 JSONDecoder 做響應式解析
- SwiftData / Core Data 前置建模:先生成 Swift struct,再手動新增 @Model 或 @NSManaged 標記進行實體對應
- 第三方 SDK 對接:把 SDK 文件中的 JSON 回應範例轉成 Swift 類型,快速接入登入、支付、推播、地圖等 SDK
- 單元測試準備:把介面 mock JSON 轉成 Swift 類型後用於 XCTest 測試資料與斷言,提升測試可維護性
- 程式碼評審:把 API 回傳 JSON 轉成 Swift 類型,便於團隊 Code Review 時討論欄位命名與可選性
- Flutter / React Native 混合開發:為呼叫原生 Swift 模組準備資料模型,減少 bridge 層的類型轉換錯誤
- 後端介面遷移:從 REST 介面文件或 Postman 範例 JSON 生成 Swift 用戶端模型,跨版本升級時快速同步
- 教學培訓:Swift / iOS 課程中示範 JSON 到類型系統的對應,幫助學生理解 API 資料建模與類型安全
- 健康與健身應用:把 HealthKit / Fitbit 等介面回傳的 JSON 轉成 Swift 類型,用於 Apple Health 資料建模
- 支付與金融應用:把支付閘道的介面回應 JSON 轉成 Swift 模型,便於對帳和異常處理
- 電商訂單系統:把訂單、商品、地址等 JSON 轉成 Swift struct,配合 SwiftUI 列表與詳情頁展示
- 新聞與內容應用:把內容管理系統的 JSON 回應轉成 Swift 類型,用於 TableView / SwiftUI 列表 / 詳情頁
- Vapor 服務端開發:把後端 API 的請求/回應 JSON 轉成 Swift 結構體,用於服務端模型定義與 Codable 編解碼
- MapKit 與地理資料:把地圖介面回傳的 JSON 轉成 Swift struct,用於地點檢索、路線規劃、地理編碼結果建模
使用方法
- 在左側編輯器貼上 JSON 內容,或點擊上傳按鈕選擇 .json / .txt 檔案,也可載入內建範例資料
- 工具會在 400ms 防抖後自動呼叫 quicktype-core 轉換,右側顯示生成的 Swift struct / class 程式碼
- 如果 JSON 格式錯誤,點擊「修復 JSON」按鈕自動修復常見語法問題(尾隨逗號、單引號、缺引號等)
- 檢查生成結果,可根據專案需要手動新增 Codable / Equatable / Identifiable 等協定;點擊「複製」貼到 Xcode,或點擊「下載」儲存為 .swift 檔案
功能特點
- 純瀏覽器本機轉換:JSON 解析與 Swift 程式碼生成全部在瀏覽器內透過 quicktype-core 完成,原始 JSON 和生成程式碼均不上傳任何伺服器
- quicktype-core just-types 模式:輸出為乾淨的 Swift struct / class 屬性宣告,無 import、無 Codable / CodingKeys 等註解,方便按專案需要再加工
- 400ms 防抖自動轉換:貼上或修改 JSON 後幾乎即時生成 Swift 類型,無需反覆點擊轉換按鈕,轉換過程完全非同步不阻塞 UI
- Web Worker 背景執行:quicktype-core 在瀏覽器 Web Worker 中執行,避免大 JSON 轉換時凍結主執行緒與編輯卡頓
- 智慧類型推斷:自動對應 String、Int、Double、Bool、[T]、自訂類型,陣列按首項類型推斷,不需要手寫欄位類型
- 巢狀物件自動展開:遞迴為每個巢狀物件生成獨立的 Swift 類型,按欄位名首字母大寫命名,避免類型重複定義
- 陣列類型自動推斷:JSON 陣列自動轉換為 [String] / [Int] / [Double] / [自訂類型],空陣列預設生成 [Any]
- 一鍵 JSON 錯誤修復:遇到尾隨逗號、單引號、缺引號、註解等常見格式錯誤時,可一鍵自動修復並繼續轉換
- 一鍵複製 + .swift 下載:把生成的 Swift 程式碼一鍵複製到剪貼簿,或下載為 .swift 檔案直接拖入 Xcode 專案
- 範例資料 + 檔案上傳:內建 Swift 風格的範例 JSON(含巢狀 address / company / tags),支援拖曳或點擊上傳 .json / .txt 檔案
- localStorage 輸入歷史:自動儲存最近輸入,重新整理或誤關頁面後可快速恢復繼續編輯,不用擔心內容遺失
- 響應式分屏編輯器:左右分屏即時預覽,桌面與行動裝置自適應,小螢幕也能順暢操作
程式碼範例
Swift:URLSession + JSONDecoder 解析生成的 struct
swiftiOS / 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)
}
}Swift:Alamofire responseDecodable 反序列化生成的類型
swift使用 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)Swift:Combine + JSONDecoder 做響應式解析
swift在 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?
}最佳实践
生成後立刻給類型加 Codable
本工具預設輸出純 struct。生成後建議立刻給所有類型加上 : Codable,否則 JSONDecoder 無法識別。CodingKeys 通常用預設列舉即可,僅在 JSON 欄位名與 Swift 風格不一致時顯式宣告。
JSON 中的 null 欄位一律改為 Optional
Swift 類型系統對 nil 嚴格。把 JSON 中可能為 null 的欄位(如中間名、頭像 URL、手機號)改成 var phone: String?,讓編譯器強制你處理 nil 分支,避免執行時崩潰。
空陣列 [] 改成具體類型而非 [Any]
空陣列無法推斷元素類型,工具會兜底生成 [Any]。建議在源 JSON 中放一個範例(如 [1, 2])重新生成,或手動改為 [String] / [User] 等具體類型,讓陣列操作有類型安全。
日期欄位配套 JSONDecoder.dateDecodingStrategy
ISO 8601 字串需要 JSONDecoder().dateDecodingStrategy = .iso8601,非標準格式需要自訂 DateFormatter。把 JSONDecoder 作為單例注入網路層,避免每個 API 單獨設定。
跨端同步使用同一份 JSON 樣本
全端專案裡,建議把後端 API 的「範例 JSON」作為單一真相源,分別用 JSON 轉 Swift / TypeScript / Java 生成對應類型,配合 CI 校驗欄位一致,避免前端改了欄位、忘了同步 iOS / Android 端。
巢狀物件命名衝突時拆分 JSON
深巢狀 JSON 容易出現同名巢狀物件導致類型衝突。建議把大 JSON 按業務模組拆分成幾個獨立 JSON 分別轉換,或在源 JSON 欄位名上加業務前綴(如 billingAddress / shippingAddress)以生成不同類型。
不要把敏感 JSON 上傳到 quicktype.io
quicktype 官方網頁版會把 JSON 傳送到他們的後端渲染。本工具完全本機執行,適合處理含 API key、token、內部介面欄位的敏感 JSON,避免資料外洩。
Xcode 專案裡建立 Models / DTOs 目錄
生成的 Swift 類型建議統一放在 Models / DTOs / Network 等目錄,方便跨模組複用。對於大型專案可進一步按業務模組拆分(如 Auth/Models、Order/Models),降低單檔案膨脹。
處理 1MB+ 大 JSON 時優先拆分子集
瀏覽器對超大 JSON 渲染效能明顯下降。建議一次只轉換一個業務模組的 JSON(100KB 以內體驗最佳),子模組分別轉換完後貼到 Xcode 不同 .swift 檔案中。
常見問題
怎麼把 JSON 轉成 Swift 結構體?
將 JSON 內容貼到左側輸入框,工具會在 400ms 防抖後自動呼叫 quicktype-core 轉換為 Swift 程式碼,並在右側面板即時顯示結果。也可以點擊上傳按鈕選擇 .json / .txt 檔案,或點擊範例按鈕載入內建資料。轉換完成後可一鍵複製或下載為 .swift 檔案。
生成的 Swift 程式碼包含 Codable 嗎?
預設不包含。本工具使用 quicktype-core 的 just-types 模式,輸出的是純 struct / class 屬性宣告,沒有 Codable、Decodable 或 Encodable 標記,也不帶 import 敘述。如果你需要 Codable,只需要在生成後手動新增 : Codable(如 struct User: Codable {}),或自行編寫 JSONDecoder 解析邏輯。
支援哪些 JSON 資料結構?
支援所有合法 JSON:基本類型(null、boolean、number、string)、一維或多維陣列、任意深度的巢狀物件。根輸入可以是 JSON 物件或 JSON 陣列,工具會以物件優先、陣列按首項推斷的方式處理。不支援的輸入包括 JavaScript 特殊值(函式、Symbol、undefined)以及非 JSON 文字。
巢狀的 JSON 物件會怎麼處理?
工具會遞迴為每個巢狀物件生成獨立的 Swift 類型。命名規則基於父類型名與欄位名組合,如 Root 包含 address 欄位時會生成 Address 子類型,主類型中透過 var address: Address 參考。這樣避免了類型重複定義,也讓 Xcode 的自動補全和類型檢查能正確追蹤層級關係。
陣列欄位會轉成 Swift 陣列嗎?
會。JSON 陣列會自動轉換為 Swift [T] 形式。如果陣列元素是字串則生成 [String],是整數則生成 [Int],是浮點數則生成 [Double],是物件則生成 [自訂類型]。空陣列 [] 由於沒有樣本元素,預設生成 [Any],建議生成後手動改為 [String] 或 [Int] 等具體類型。
null 值欄位會生成什麼類型?
JSON 中的 null 值無法推斷具體類型,工具可能生成 Any 或兜底類型。建議把源 JSON 中值為 null 的欄位替換為範例值(如 "field": "" 推斷為 String)或根據業務手動改為 Optional(如 var phone: String?),這樣更符合 Swift 類型系統的安全語意。
可以自訂生成的結構體名稱嗎?
可以。在工具列點擊類型名稱按鈕(或設定入口),即可修改根類型名稱(預設如 Root 或根據範例資料推斷)。子類型命名會基於根名稱和欄位名自動生成,命名規則是欄位名首字母大寫,例如 users → User、tags → Tag。
JSON 格式錯誤怎麼辦?
工具會自動偵測 JSON 合法性,錯誤時會在右側顯示具體錯誤提示,並提供「修復 JSON」按鈕。點擊後可自動修復常見錯誤:末尾多餘逗號、單引號替換為雙引號、缺失引號的 key 補全、註解移除等。修復成功後即可繼續轉換,無需手工改 JSON。
資料會上傳到伺服器嗎?隱私安全嗎?
完全本機瀏覽器執行。所有 JSON 解析、Swift 程式碼生成都透過瀏覽器 JavaScript(含 Web Worker 中的 quicktype-core)在本機完成,輸入的 JSON 資料和生成的 Swift 程式碼不會被上傳到任何伺服器,也不會被記錄或快取到雲端。包含 API key、token、使用者隱私欄位、未上線業務結構等敏感 JSON 都可以放心使用,關閉頁面即清除。
生成的程式碼能直接用於 Xcode 專案嗎?
可以。生成的程式碼是標準 Swift 語法,可直接複製到 Xcode 的 .swift 檔案中,或透過「下載」按鈕儲存為 .swift 檔案拖入專案。由於輸出為純類型宣告,建議根據專案需要手動新增 Codable、Equatable、Identifiable 等協定,或者調整存取控制修飾詞(public / internal / private)。
支援 JSON 陣列作為根輸入嗎?
支援。當根輸入是 JSON 陣列時,工具會以陣列第一個元素為模板生成元素類型,並輸出該元素類型定義。例如 [{"id":1,"name":"A"}] 會生成名為 Item 的 struct(或基於欄位推斷的名字),其欄位就是第一個元素的欄位;主類型透過 property items: [Item] 參考,避免直接把陣列當根類型。
轉換大 JSON 會卡嗎?
工具沒有顯式大小限制,但瀏覽器對超大 JSON 的解析與渲染會變慢。建議:① 一次只轉換一個業務模組的 JSON;② 巢狀層級過深時拆分層級處理;③ 超過數 MB 的 JSON 可使用命令列版的 quicktype 處理;④ 把同一個 JSON 拆分成多個子模組分別轉換可顯著降低記憶體佔用。
可以和 JSON 轉 TypeScript 互相替代嗎?
兩者都是把 JSON 轉為對應語言的類型定義,但側重點不同:JSON 轉 Swift 生成 struct / class 屬性宣告,用於 iOS / macOS 原生應用;JSON 轉 TypeScript 生成 interface / type 宣告,用於前端類型檢查。如果你的專案同時有 iOS 用戶端和 Web 前端,建議對同一份 JSON 分別生成 Swift 與 TS 兩個版本,保證兩端類型一致。
如何在生成的程式碼中加入 Codable 協定?
本工具預設輸出純類型,不直接帶協定。生成後你只需要在 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 即可。
支援 Swift enum 推斷嗎?
quicktype 對 union/列舉的支援需要額外的 type hints 或 GraphQL/JSON Schema 輸入。僅基於 JSON 樣本難以推斷列舉,因此本工具預設不會生成 enum。如果你需要列舉,可以手動把對應 struct 改為 enum + Codable,或改用 JSON 轉 Kotlin / TypeScript 工具先得到 enum 類型,再手動遷移到 Swift。
故障排查
提示「請輸入 JSON 資料」或右側為空
左側輸入框為空或只有空白字元。請貼上有效的 JSON 內容,或點擊「範例」載入樣例,或點擊「上傳」選擇 .json / .txt 檔案。
提示「Unexpected token ... in JSON」
JSON 格式不合法。常見原因:① 末尾有多餘逗號(如 {"a":1,});② 用了單引號而非雙引號;③ JS 物件寫法(如 {key: value})而非 JSON(如 {"key": "value"});④ 含 JavaScript 註解。點擊「修復 JSON」按鈕可自動修復部分常見錯誤。
生成的類型沒有 Codable,無法直接用 JSONDecoder
這是預期行為。本工具使用 just-types 模式,輸出純 struct / class 屬性宣告。如需 Codable,請在生成後給類型新增 : Codable(如 struct User: Codable {}),或寫 extension User: Codable {} 後再呼叫 JSONDecoder。
空陣列 [] 生成了 [Any]
空陣列沒有樣本元素,工具會生成兜底類型 [Any]。建議在源 JSON 中至少放入一個範例元素(如 [1, 2]),生成後再刪除範例值,並手動指定具體類型;或在生成後直接改為 [String] / [User] 等更精確的類型。
null 值欄位類型不確定
JSON null 無法推斷具體類型,工具可能生成 Any 或兜底類型。建議把源 JSON 中的 null 替換為代表性範例值(如 "" 或 0),生成後再把該欄位改為 Optional(?)或具體類型,例如 var phone: String?。
生成的類型名不符合專案規範
可在工具列修改根類型名稱,子類型名會基於根名稱 + 欄位名自動生成。如果仍不滿意,生成後在 Xcode 中使用 Rename 重構批次修改(右鍵 → Refactor → Rename),Xcode 會同步更新所有參考。
大 JSON 轉換後頁面卡頓
瀏覽器渲染超大 JSON 和生成大量類型時會變慢。建議把 JSON 拆分成多個獨立業務模組分別轉換,或僅提取需要建模的關鍵物件進行轉換;超過 10MB 的 JSON 推薦使用命令列版的 quicktype 處理。
Xcode 編譯報錯「Type 'X' does not conform to protocol 'Decodable'」
說明你給某些欄位加 Codable 後,沒有正確處理 Optional / Date / Enum 等類型。常見修復:① 把所有可能為 null 的欄位改為 Optional<T>;② 自訂日期策略 JSONDecoder().dateDecodingStrategy = .iso8601;③ 自訂 CodingKeys 讓 JSON key 與 Swift 屬性名一致。
欄位名是 snake_case,Swift 習慣是 camelCase
本工具預設保留 JSON 原欄位名,因此 snake_case 欄位會原樣生成。若想統一為 camelCase,可在生成後用 Xcode Rename 批次重新命名,或在自訂 quicktype 渲染器中將欄位名轉換為 camelCase,再補充 CodingKeys 對應,保證 JSON 解碼正確。
下載的 .swift 檔案用 Xcode 開啟後中文 key 報錯
Swift 推薦欄位名為英文 ASCII 識別碼。若源 JSON 含中文 key(如 {"姓名": "Alice"}),生成的 var 姓名: String 會讓 Swift 編譯器對部分歷史版本報錯。建議在源 JSON 中把 key 改為英文(如 name),更符合 Swift 編碼規範。
類型只有 var,沒有 let / private 控制
本工具預設生成 var public 屬性,方便生成後再加工。如需 let 或存取控制(如 private(set)),可在 Xcode 中使用 Refactor → Add Access Control 批次修改,或在生成後用 sed / 文字編輯工具替換 var 為 let。
JSON 含 ISO 8601 日期字串,生成 Date 欄位解碼失敗
本工具預設把 ISO 8601 字串對應為 String,Swift 不會自動轉換為 Date。需要在 JSONDecoder 中設定 dateDecodingStrategy,例如 JSONDecoder().dateDecodingStrategy = .iso8601。如果日期格式非標準,還需手動實作 DateFormatter 或自訂解析邏輯。
巢狀層級太深,名字衝突
工具以「欄位名首字母大寫」為子類型命名。深巢狀 JSON 中可能出現同名巢狀物件導致類型衝突。解決方法:① 在源 JSON 中給欄位加上業務前綴;② 把根 JSON 拆分為多個獨立模組分別生成;③ 生成後用 Xcode Rename 批次修改衝突的類型名。
生成的是 public struct 但專案用 module 隔離
本工具預設生成 internal struct,沒有顯式 public 修飾詞。如果專案按 module 拆分且需要跨模組存取,需要在 Xcode 中批次替換 struct 為 public struct,或在生成後用 sed/awk 腳本統一加 public 關鍵字。
術語表
- struct
- Swift 中的值類型。預設適合表示不可變資料模型,賦值時會被複製。本工具預設生成 struct 用於表示 JSON 物件。
- class
- Swift 中的參考類型。適合需要共享狀態、繼承或身分標識(===)的場景。本工具在某些設定底下可生成 class。
- Optional(?)
- Swift 中表示值可能為 nil 的類型修飾符,如 var name: String?。本工具生成的欄位預設非 Optional,生成後可根據 JSON 欄位是否可缺失手動新增 ?。
- Array([T])
- Swift 中的陣列類型簡寫。本工具把 JSON 陣列轉換為 [T],T 按陣列元素類型推斷,如 [String]、[Int] 或 [自訂類型]。
- Codable
- Swift 中 Decodable 與 Encodable 的協定組合。實作 Codable 後可用 JSONDecoder 把 JSON 資料解析為類型實例。本工具預設不生成 Codable,需手動新增。
- JSONDecoder
- Foundation 框架中的 JSON 解析器。配合 Codable 協定使用,可把 Data 轉換為 Swift 類型實例。本工具輸出純類型後,開發者可自行用 JSONDecoder 解析。
- URLSession
- Apple 平台 Foundation 框架中的網路請求 API。常見用法是 URLSession.shared.data(from: url),與 JSONDecoder 配合完成介面串接。
- Alamofire
- Swift 社群最流行的第三方 HTTP 網路程式庫。基於 URLSession 封裝,支援 responseDecodable 直接反序列化為 Swift 類型。
- Moya
- Swift 網路抽象層,通常與 Alamofire 搭配。Moya 配合 Codable 類型可大幅簡化 API 呼叫樣板程式碼。
- Vapor
- Swift 主流的服務端框架,使用 Swift 在 macOS / Linux 上建構 Web 應用。本工具生成的 Swift 結構體同樣可以用於 Vapor 的路由模型。
- quicktype
- 支援多語言的類型生成器開源工具,本工具透過 quicktype-core 在瀏覽器 Web Worker 中完成 JSON 到 Swift 的轉換。
- Property
- Swift 類型中的屬性宣告。本工具把 JSON 的每個 key 對應為一個 Swift property,例如 "name": "Alice" 對應為 var name: String。
- Type Inference
- 根據 JSON 值的字面值形式自動推斷 Swift 類型的過程。本工具依據 null、boolean、number、string、array、object 做對應。
- localStorage
- 瀏覽器本機鍵值儲存。本工具用 localStorage 儲存最近輸入歷史,重新整理或誤關頁面後可恢復。
- Web Worker
- 瀏覽器提供的背景執行緒機制。本工具透過 Web Worker 載入和執行 quicktype-core,避免大 JSON 轉換阻塞主執行緒。
- SwiftUI
- Apple 推出的宣告式 UI 框架。本工具生成的 Swift 類型可作為 SwiftUI 檢視的資料模型,配合 @State / @ObservedObject 驅動介面。
- Combine
- Apple 的響應式程式設計框架。生成的 Swift 類型結合 JSONDecoder 可建構 dataTaskPublisher 響應式資料流。
- SwiftData
- Apple 2023 年推出的資料持久化框架。本工具生成的類型可作為 SwiftData 模型基礎類別,新增 @Model 後即可被 SwiftData 管理。
- Value Type / Reference Type
- Swift 中 struct 是值類型,class 是參考類型。本工具預設生成 struct,賦值時被複製;如需參考語意可手動改為 class。
- Field Naming
- 本工具預設保留 JSON 原欄位名。若源 JSON 為 snake_case 而專案要求 camelCase,需要手動 rename 或自訂 quicktype 渲染器。
- ISO 8601 日期
- 常見 JSON 日期格式,如 2026-07-14T10:00:00Z。需要配套 JSONDecoder.dateDecodingStrategy = .iso8601 才能正確解析到 Date 類型。
JSON 類型到 Swift 類型對應速查表
工具根據 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 | 遞迴生成獨立類型,命名按欄位名首字母大寫 |
JSON 轉 Swift 在 Apple 生態中的常見使用場景
生成的 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 |
Privacy & Security
本 JSON 轉 Swift 工具所有 JSON 解析、Swift 類型生成操作完全在你的瀏覽器本機透過 JavaScript(quicktype-core / Web Worker)完成,輸入的 JSON 資料和生成的 Swift 程式碼都不會被上傳到任何伺服器,也不會被記錄、快取或儲存到雲端。包含內部介面欄位、API key、token、使用者隱私資料、未公開業務結構的敏感 JSON 都可以放心使用,關閉或重新整理頁面後所有輸入和輸出內容自動從記憶體清除,不依賴任何第三方網路服務。
Authoritative References
- AppleApple Developer - Swift Codable 官方文件
- Swift.orgSwift.org - 官方文件
- AppleApple Developer - JSONDecoder 文件
- AlamofireAlamofire GitHub 倉庫
- quicktypequicktype GitHub 倉庫
- JSON 壓縮
- CSV 轉 JSON
- JSON 轉 CSV
- JSON Diff
- JSON Escape / Unescape
- JSON 扁平化
- JSON 格式化
- JSON 產生器
- JSONPath 查詢
- JSON 合併
- JSON 修復
- JSON Schema 驗證器
- JSON 排序
- JSON Stringify
- JSON 轉 HTML 表格
- JSON 轉 Java
- JSON 轉 Markdown
- JSON 轉 SQL
- JSON 轉 TOML
- JSON 轉 TypeScript
- XML 轉 JSON
- JSON 轉 XML
- YAML 轉 JSON
- JSON 轉 YAML
- JSON 轉 Go
- JSON 轉 Rust
- JSON 轉 Swift
- JSON轉C#
- JSON 轉 C++
- JSON 轉 PHP
- JSON 轉 Python