JSONの解析とCodableプロトコル

Swiftにおけるネットワーク通信では、REST APIなどから取得したデータがJSON形式であることが一般的です。そのため、受け取ったJSONをSwiftの型(構造体やクラス)に変換(デコード)する処理が必要になります。このとき重要な役割を果たすのが、Codableプロトコルです。


1. Codableプロトコルとは

Codableは、Swift標準ライブラリに用意されているプロトコルで、以下の2つのプロトコルを統合したものです。

swift
typealias Codable = Encodable & Decodable
  • Encodable: Swiftの型をJSONなどの形式にエンコード(変換)できることを表す

  • Decodable: JSONなどをSwiftの型にデコード(変換)できることを表す

つまり、Codableに準拠した型は、JSONへの変換とJSONからの変換の両方が可能になります。


2. JSONをデコードする流れ

例えば、以下のようなJSONデータがAPIから返ってきたとします。

json
{ "id": 101, "title": "Swift入門", "author": "山田" }

このJSONをSwiftの構造体に変換するには、次のようにします。

構造体を定義

swift
struct Book: Codable { let id: Int let title: String let author: String }

JSONデータをデコード

swift
let jsonData = ... // Data型として取得したJSONレスポンス do { let book = try JSONDecoder().decode(Book.self, from: jsonData) print(book.title) // "Swift入門" } catch { print("デコード失敗: \(error)") }

JSONDecoderクラスは、Data型のJSONをCodable準拠の型に変換します。


3. JSONをエンコードする流れ

逆に、Swiftの構造体をJSONに変換するには以下のようにします。

swift
let book = Book(id: 101, title: "Swift入門", author: "山田") do { let jsonData = try JSONEncoder().encode(book) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) } } catch { print("エンコード失敗: \(error)") }

出力されるJSON文字列は次のようになります。

json
{"id":101,"title":"Swift入門","author":"山田"}

4. JSONキーとSwiftのプロパティ名が異なる場合

APIから返されるJSONのキーがSwiftのプロパティ名と異なる場合は、CodingKeysという列挙型を定義して対応します。

swift
struct Book: Codable { let bookID: Int let bookTitle: String let bookAuthor: String enum CodingKeys: String, CodingKey { case bookID = "id" case bookTitle = "title" case bookAuthor = "author" } }

まとめ

  • SwiftのCodableプロトコルは、JSONの**デコード(解析)とエンコード(変換)**を簡単にする仕組み

  • JSONDecoderとJSONEncoderを使って、JSONとの変換が可能

  • CodingKeysを定義することで、異なるキー名にも柔軟に対応できる

Codableは、安全かつ簡潔にJSONを扱うための重要なツールです。実際のAPI通信でも頻繁に利用されます。

生成日:2025/05/04