logo
GeekFormat

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,用於地點檢索、路線規劃、地理編碼結果建模

使用方法

  1. 在左側編輯器貼上 JSON 內容,或點擊上傳按鈕選擇 .json / .txt 檔案,也可載入內建範例資料
  2. 工具會在 400ms 防抖後自動呼叫 quicktype-core 轉換,右側顯示生成的 Swift struct / class 程式碼
  3. 如果 JSON 格式錯誤,點擊「修復 JSON」按鈕自動修復常見語法問題(尾隨逗號、單引號、缺引號等)
  4. 檢查生成結果,可根據專案需要手動新增 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

swift

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)
    }
}

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?
}

最佳实践

常見問題

怎麼把 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 類型說明
nullvalue === nullAny? 或具體 Optional無法推斷具體類型,生成後建議手動改為 Optional<T>
true / falsetypeof value === 'boolean'Bool直接對應為 Swift 布林類型
42typeof value === 'number' && Number.isInteger(value)Int整數對應為 Int(32/64 位元由平台決定)
3.14typeof 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,配合 responseDecodablesession.request(url).responseDecodable(of: User.self)
抽象網路層Moya為類型加 Codable,Moya 自動反序列化provider.request(.user(id: 1)).map(User.self)
響應式資料流Combine + JSONDecoder為類型加 Codable,結合 dataTaskPublisherURLSession.shared.dataTaskPublisher(for: url).decode(type: User.self, decoder: decoder)
SwiftUI 列表展示SwiftUI List + Identifiable為類型加 Identifiable,讓 List 自動 forEachList(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