Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Codable / Encodable / Decodable
Swiftの『Codable』プロトコルを使うと、struct や class を JSON に簡単にエンコード・デコードできます。『Encodable』と『Decodable』を合成した typealias です。
メソッド一覧
| クラス / メソッド | 概要 |
|---|---|
| Codable | Encodable と Decodable を合成したプロトコルです。 |
| JSONEncoder().encode(_:) | Encodable な値を JSON の Data に変換します。 |
| JSONDecoder().decode(_:from:) | JSON の Data を指定した型にデコードします。 |
| CodingKeys | プロパティ名と JSON キー名のマッピングを定義します。 |
| encoder.outputFormatting | 出力形式(prettyPrinted 等)を設定します。 |
| encoder.dateEncodingStrategy | Date の変換方法を設定します。 |
サンプルコード
import Foundation
// Codable に準拠する struct
struct User: Codable {
let id: Int
let name: String
let email: String
var isActive: Bool
}
// エンコード: Swift → JSON
let user = User(id: 1, name: "Alice", email: "alice@example.com", isActive: true)
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // 読みやすい形式
if let jsonData = try? encoder.encode(user),
let jsonString = String(data: jsonData, encoding: .utf8) {
print("JSON:")
print(jsonString)
}
// デコード: JSON → Swift
let jsonString = """
{
"id": 2,
"name": "Bob",
"email": "bob@example.com",
"isActive": false
}
"""
let decoder = JSONDecoder()
if let data = jsonString.data(using: .utf8),
let decodedUser = try? decoder.decode(User.self, from: data) {
print("\nデコード: \(decodedUser.name) (\(decodedUser.email))")
}
// CodingKeys: JSON キー名とプロパティ名のマッピング
struct Article: Codable {
let articleId: Int
let articleTitle: String
enum CodingKeys: String, CodingKey {
case articleId = "article_id" // snake_case → camelCase
case articleTitle = "article_title"
}
}
let articleJson = """
{"article_id": 10, "article_title": "Swift入門"}
"""
if let data = articleJson.data(using: .utf8),
let article = try? decoder.decode(Article.self, from: data) {
print("記事: \(article.articleTitle) (ID: \(article.articleId))")
}
概要
型のプロパティ名と JSON のキー名が一致していれば、『Codable』を採用するだけで自動的にエンコード・デコードが可能です。カスタマイズが必要な場合は『CodingKeys』enum を定義します。
snake_case の JSON を camelCase のプロパティにマッピングする場合は、CodingKeys で個別に対応するか、『decoder.keyDecodingStrategy = .convertFromSnakeCase』を使う方法もあります。デコードに失敗した場合は例外が投げられます。try? で nil にするか do-catch で詳細なエラーを取得してください。
プロトコルの基本についてはprotocol の基本 / 準拠を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。