【Swift】CodableでJSONをDecodeする方法

この記事で紹介するコードはSwift5、iOS13で動かした時の物です。

JSONをパースする時にはCodableを継承したStructを作ります。

以下のような感じ。

例えば、{"name":"hoge"}のJSONが与えられた時には以下のコードでパースできます。

上記の例は、JSONの”name”がString型で返ってくることが確定している場合は問題がありませんが、JSON内の要素の型が時々変わるもの場合にはエラーが出ます。

以下の例を見てみよう。

budgetの値がIntで返ってくる時もあればStringで返ってくることがある。

例えば、{"budget":3000} or {"budget":""}のケース。

Stringが返ってきた場合には上記の構造体ではパースした時にエラーが出る。

このようなイレギュラーなケースに対応するためは、手動でDecode処理を実装する必要がある。

Codableを継承している場合、Decodeはinit内で行う。

CodingKeysにキー名を羅列し、キー名を指定してデコードする。

以下の実装例を見てみよう。

  1. CondingKeysにbudgetを追加。
  2. budgetをInt型とString型の両方でデコードする。
  3. Int型でデコードできた場合にはそのまま代入、できなかった場合には0を代入する。

こんな感じ。

終わり。