Swift の Codable プロトコルは、JSON を Swift のネイティブな構造体やクラスに簡単に変換します。JSON と同じキーと値を保持するデータ型を設計し、JSONDecoder を使用して変換するだけです。
重要: この記事を投稿したのが2019年07月08日(月)で自身の法人サイトの方でしたけれども、公式サイトの更新などでブログ系のメンテナンスが大変だったので、ここに過去の投稿の移動とこれからの記事を投稿をする予定です。
次は、私たちが良く扱うJSONの例です。
let jsonString = [
{
"name": "武田信玄",
"age": 26
},
{
"name": "上杉謙信",
"age": 25
}
]
let jsonData = Data(jsonString.utf8)
これは2人の人間を配列に格納するもので、それぞれ名前と年齢を持つ。
そして、これらのフィールドを保持する事の出来るSwiftの構造体を作る必要があります。Codable が持つ唯一の要件は、構造体の中のすべてのプロパティが Codable に準拠していることです - 私たちの場合、それは文字列と整数です。
この構造体を追加する事から始めます。
struct Person: Codable {
var name: String
var age: Int
}
あとは、JSONデータをそのPerson
構造体の配列に決定していきます。これは throw 操作なので、try を使う必要があります。以下、コード例です。
let decoder = JSONDecoder()
do {
let people = try decoder.decode([Person].self, from: jsonData)
print(people)
} catch {
print(error.localizedDescription)
}
その結果、JSONから2つのperson
構造体を保存することになります。そして、Swiftの型にパースされているので、型安全な方法でそれらを参照することができます。
オプション
APIのレスポンスで帰ってきた構造体が異なるキー名を利用している時、これをSwift側のPerson
構造体に合わせることが出来ます。例えば、"user_name"
と"user_age"
がレスポンス側のキー名として、これをname
とage
に置き換えたい時は下記のように行います。
struct Person: Codable {
var name: String
var age: Int
enum CodingKeys: String, CodingKey {
case name = "user_name"
case age = "user_age"
}
}
以上となります。