Swift : オブジェクトをJSON形式に変換する(逆も)

1 min読了の目安(約1500字TECH技術記事

環境

この記事の情報は以下のバージョンで動作確認しています。

  • Xcode 12.3 (12C33)
  • Swift 5.3.2

概要

近年はテキストベースのデータフォーマットとして JSON がよく使われます。JSONは軽量であり可読性も高く、多くのプログラミング言語でサポートされているのが特徴です。
そんな JSONフォーマットですが、Swiftで扱う際にデータ保存や通信を行う場合に、情報を格納している構造体をJSON形式に変換したい場合があると思いますが、今回ご紹介する方法を使用することで簡単に実現することができます。

Codableプロトコル

オブジェクトを他のデータ形式に変換するために Codableプロトコル を使用します。ファイルに保存する際や通信データ生成する際に、バイナリ形式や特定の文字列に変換する際に使用しますが、今回はこのプロトコルを使用した Swiftオブジェクト⇆JSON形式の変換方法 を紹介します。

使用するには データ変換を行う構造体の型が Codableプロトコル に準拠している必要があります。

以下、使用例です。

// 商品情報格納構造体
struct Goods : Codable{
   var Price: Int          // 値段
   var Name: String        // 商品名
   var Category: String    // 商品カテゴリー名
}

オブジェクト → Json

先述の Codableプロトコルに準拠した Goods構造体をJson形式に変換します。変換するには、JSONEncoderクラス の encode関数 を使用します。
第一引数は、Goods構造体 を指定します。
しかし、encode関数は例外をスローする可能性があるため try を付与し呼び出します。

以下、使用例です。

// Json変換関数
func toJson(goods: Goods) -> Data {
       
    // オブジェクトからJsonに変換
    let encoder = JSONEncoder()
    guard let jsonValue = try? encoder.encode(goods) else {
       fatalError("Failed to encode to JSON.")
    }
       
    return jsonValue;
}

Json → オブジェクト

先述の Json形式で出力したデータをGoods構造体にします。変換するには、JSONDecoderクラス の decode関数 を使用します。
第一引数は、構造体名.self を指定します。
第二引数は、変換元のjsonValue(Data型)を指定します。

// オブジェクト変換関数
func toObject(jsonValue: Data) -> Goods? {
       
    // Jsonからオブジェクトに変換
    let decoder = JSONDecoder()
    guard let goods: Goods = try? decoder.decode(Goods.self, from: jsonValue) else {
       fatalError("Failed to decode from JSON.")
    }
       
    return goods
}