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)、1次元または多次元配列、任意の深さのネストオブジェクト。ルート入力は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の解析とレンダリングは遅くなります。推奨事項:① 1つのビジネスモジュールのJSONのみを一度に変換する、② ネスト階層が深すぎる場合は階層を分割して処理する、③ 数MBを超えるJSONはコマンドライン版のquicktypeを使用する、④ 同じJSONを複数のサブモジュールに分割してそれぞれ変換するとメモリ使用量が大幅に削減される。
どちらもJSONを対応する言語の型定義に変換しますが、重点が異なります:JSONからSwiftはstruct/classプロパティ宣言を生成し、iOS/macOSネイティブアプリに使用;JSONからTypeScriptはinterface/type宣言を生成し、フロントエンドの型チェックに使用します。プロジェクトにiOSクライアントとWebフロントエンドの両方がある場合は、同じJSONに対してSwiftとTSの2つのバージョンをそれぞれ生成し、両端の型の一貫性を保証することを推奨します。
このツールはデフォルトで純粋な型を出力し、プロトコルは直接付属しません。生成後、struct/class宣言の後に: Codableを追加するだけです。例:struct User: Codable {}。これでJSONDecoderが使用できるようになります。デフォルトでCodableを付けたい場合は、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つのサンプル要素(例:[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も安心して使用でき、ページを閉じるかリフレッシュするとすべての入出力コンテンツはメモリから自動的に消去され、いかなるサードパーティネットワークサービスにも依存しません。