さるへい備忘録

さるへいのやったことを綴っているブログです。基本的にテクノロジーの話題です。

JSONを扱うにはCodableが便利

Swiftを5年ぶりに触ってたんですが、なんだかCodableというJSONを簡単に扱えるプロトコルが実装されてて非常に感動しました。
3週間前のメモなんで8割がた忘れちゃったんですが、頑張って思い出しながら書いてみます。

Codableとは

公式のリファレンスはこちら (https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types)

ざっくりいうと、ネットワーク経由でのデータのやりとりやデータのファイル保存で扱うJSONなどをカスタムした型へエンコードやデコードするためのプロトコルって話ですね。
今回はJSON利用しましたが、他にもいろいろ使えそうな予感がします。

JSONをCodableを用いて扱う具体例

扱うjsonは以下
入れ子構造にしてみました。

{
  "name": "saruhei",
  "address": {
    "country": "Japan",
    "city": "Tokyo"
  }
}

JSONをデコード

struct Sample: Codable {
    let name: String
    let address: AddressBody
    struct AddressBody: Codable {
        let country: String
        let city: String
    }
}

let jsonData: String = "さっきのJSONデータ"
let decoder: JSONDecoder = JSONDecoder()
do {
    let sample: Sample = try decoder.decode(Sample.self, from: jsonData.data(using: .utf8)!)
    let name = (sample.name)
} catch {
     print("なんかエラー処理")
}

これだけで大丈夫のよう。
JSONデコーダーでCodableが勝手にマッピングしてくれます。なにこれ便利

JSONエンコード

struct Sample: Codable {
    let name: String
    let address: AddressBody
    struct AddressBody: Codable {
        let country: String
        let city: String
    }
}

let sample = Sample(name: "saruhei", address: Sample.AddressBody(country: "Japan", city: "Tokyo"))

let encoder = JSONEncoder()
do {
    let data = try encoder.encode(sample)
    let jsonstr:String = String(data: data, encoding: .utf8)!
    print(jsonstr)
} catch {
    print("なんかエラー処理")
}

こっちもまぁ簡単ですね。 想像どおりのコードになりました。

まとめ

コードにツッコミどころはあるかもしれませんが。それはまぁこんな感じで実装できるよって目安程度だと思ってください。 SwiftでJSON扱うのはもう全然大変じゃない!Codableでドカンと一発!以上!

参考にした記事

【Swift】Codableについて備忘録 - Qiita

SwiftでJSON作成、読込みする方法( Swift4 Codableを利用) – digitalnauts – Medium