iOS の JSON のパース方法(Swift)

botman_blue iOS

Xcode-12.4 Swift-5.3

はじめに

Codable を使った JSON のパース方法についてです。

公式リファレンス

使い方

使い方は簡単! Codable を継承させるだけ!(デコードだけしたい場合は Decodable のみでも OK)

色々なJSON

オプショナル

下記のように JSON に num のキーが存在しない場合このままではエラーになります。

keyNotFound(CodingKeys(stringValue: "num", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"num\", intValue: nil) (\"num\").", underlyingError: nil))

下記のように Optional 型にしてやるとパースできます。

もしくは CodingKeysinit を実装して下記のようにデコードできなかったときに初期値を設定してやる方法だと Optional 型を避けることもできます。

どちらも下記のように null の場合もパースできます。

プロパティ名とキー名が違う場合

下記のように JSON のキーと異なるプロパティ名にしたい場合は CodingKey を使います。

スネークケースの場合は下記のように keyDecodingStrategy 設定することでもパースできます。

入れ子

Codable のプロパティに Codable を継承した型を利用できます。

下記のようにリストもあつかえます。

enum

下記のように enum にパースできます。

特殊なパース方法

上記のような JSON から下記のような構造体を生成したい場合。

下記のように nestedContainernestedUnkeyedContainer を利用すればパースできます。

おわりに

これでだいたいパースできるはず!

JSONDecoder.DateDecodingStrategy というのもあるらしいので Date 型にパースする場合は利用するといいのかも?

JSONExport を使えば簡単に JSON から Codable に準拠したクラスが生成できるので大量のキーが有る場合は便利です。

参考

コメント

タイトルとURLをコピーしました