【Swift】Codableを使ったJSON変換

Codableを使ったJSON変換について解説します。

スポンサーリンク

環境

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

【Xcode】11.6
【Swift】5.2.4
【iOS】13.6
【macOS】Catalina バージョン 10.15.5
スポンサーリンク

Codableとは?

インスタンス(オブジェクト)情報を、他の形式にデータ変換するプロトコルです。
ファイルに格納したり、ネットワークで送受信したりするためにバイト列や文字列に変換する際に使用します。
使用するにはデータ変換に使う構造体の型がCodableプロトコルに準拠している必要があります。
このプロトコルを利用してSwiftオブジェクト←→JSON形式の変換が可能です。

スポンサーリンク

JSONとは?

テキストベースのデータ交換用フォーマットです。
軽量で読みやすく、多くのプログラミング言語でサポートされているのが特徴です。
扱える型は、文字列、数値、null値、boolean(true/false)、配列、オブジェクト。
文字コードはutf-8固定です。

スポンサーリンク

基本的な構造体のJSON変換

基本的な構造体オブジェクトとJSON形式を相互変換する例を紹介します。
(※構造体の代わりにクラスを使用した場合も同様です)

まずは全体ソース。

対象の構造体

従業員情報を保持する構造体です。
Codableを使う為の条件として、Codableプロトコルに準拠している必要があります。

オブジェクトをJSONへ変換する

JSONEncoder()のインスタンスメソッド.encode()で対象のオブジェクトをJSON形式に変換します。
このメソッドは例外をスローする可能性があるので、tryを付けて呼び出します。
この例ではtry?を使っているので、例外自身は無視されますが、戻り値がnullになりますのでその場合はfatalError()が発生します。

JSONデータを確認する

確認の為、変換後のJSONデータ(jsonValue)を表示しているコードです。
jsonValueはData型の為、String(bytes:,encoding:)で文字列に変換してからprintしています。
encodingにはJSONの文字コードであるutf-8を指定します。

実際の出力結果がこちらです。

JSONの整形

次のように、JSONEncoder()インスタンスのプロパティoutputFormattingに.prettyPrintedを指定すると、出力結果を人の目に見やすいように整形できます。

出力結果はこのように変わります。

JSONからオブジェクトに変換

先程とは逆の変換処理です。
JSONEncoder()の代わりにJSONDecoder()を、.encode()の代わりに.decode()を使用します。
.decodeの第一引数には、"構造体名.self"を指定します。
第二引数には、変換元のjsonValue(Data型)を指定します。

最終データ確認

確認の為、JSONから変換されたオブジェクト(employee)を表示しているコードです。
出力結果はこちら。

スポンサーリンク

配列のJSON変換

先程のサンプルを、オブジェクトの配列に変更してみます。

初期オブジェクト生成

変換元のオブジェクトを、このように配列に変更します。
JSONへの変換処理には特に変更はありません。

JSONからオブジェクトに変換

受け取るオブジェクトemployeesは配列型[Employee]になります。
.decode()メソッドの第一引数の型も、配列型"[Employee].self"に変更します。

全体ソースと実行結果

出力結果

スポンサーリンク

複雑な構造体のJSON変換

オブジェクトのプロパティがさらにオブジェクトの配列になっているような複雑なデータもJSON変換可能です。

出力結果

スポンサーリンク

オプショナル型の指定

従業員情報のプロパティで「役職」のように、人によっては値を持たないケースがあります。
その場合は構造体の定義でオプショナル型を指定すると良いです。
値がnilのプロパティをJSON変換するとそのキー自体が無くなります。

出力結果

スポンサーリンク

日付のフォーマット変換

JSONで日付データは文字列型を使用しますが、変換フォーマットを指定する事でSwiftのDate型と直接変換ができます。
以下は社員情報に入社日dateOhHireを設けて、標準的なフォーマットの.iso8601(ISO8601形式)を指定した例です。

出力結果

日付フォーマットをカスタマイズする

次のようにDateFormatterを利用して、日付フォーマットをカスタマイズできます。

出力結果

スポンサーリンク

キーマッピングの変更

Swiftのプロパティ名と、JSONのキー名が完全には一致しない場合は、キーマッピングの指定が可能です。
次のように対象の構造体でCodingKeysというenum型を追加して、case名にプロパティ名を、「= "キー"」でJSONのキー名を指定します。
キー名が無い場合は、同名で変換されます。
caseが無いプロパティは変換の対象外になりますが、decodeで使う場合はデフォルト値の設定が必要です。

出力結果

スポンサーリンク

あわせて読みたい記事

【Swift】プロジェクト内のJSONファイル読み込み
プロジェクトにバンドルされたJSONファイルを読み込む方法を解説します。
【Swift】DateFormatterの使い方
日付と時間の書式を定義するクラスです。Date構造体←→テキストの相互変換に使います。
【SwiftUI】@ObservedObjectをCodable変換する方法
@ObservedObjectをCodable変換する方法について解説します。
Kindle unlimited 読み放題で読める管理人のおすすめ本です!
スポンサーリンク
swift
カピ通信