LoginSignup
0
2

More than 1 year has passed since last update.

【Swift】Codableを使用してJSONをSwiftのオブジェクトに変換する方法

Posted at

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"がレスポンス側のキー名として、これをnameageに置き換えたい時は下記のように行います。

struct Person: Codable {
  var name: String
  var age: Int

  enum CodingKeys: String, CodingKey {
    case name = "user_name"
    case age = "user_age"
  }
}

以上となります。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2