LoginSignup
2
3

More than 3 years have passed since last update.

【Swift】Decodable(Codable)でparseエラーになる条件まとめ

Posted at

仕事してて混乱してしまったので、整理します。

サンプル

基本はこんな使い方をしますよね。

struct Sample: Codable {
    let name: String
    let age: Int
}
{
    name: "Tommy",
    age: 20
}

今回はparseエラーになる条件を整理します。
(そもそもデータをLoadできてないなどのエラーについては扱わず、parse自体は行ったが、エラーになったケースだけにしぼります)

parseエラーになる条件

  • キー名が不一致
  • 型情報が不一致
  • 非オプショナルで指定した値が存在しない

キー名が不一致

struct Sample: Codable {
    let name: String
    let age: Int
}
{
    user_name: "Tommy",
    age: 20
}

API担当者とちゃんと認識合わせしましょう、以上なんですが、
Swiftのルールとサーバーサイドの命名ルールが合わなくて苦しむこともあると思うので、そういうときは無理に統一せず、CodingKeysを使いましょう。

struct Sample: Codable {
    let name: String
    let age: Int

    enum CodingKeys: String, CodingKey {
        case name = "user_name"
    }
}

型情報が不一致

JSONの型と想定している型が不一致だとparseに失敗します。

struct Sample: Codable {
    let name: String
    let age: Int
}
{
    name: "Tommy",
    age: "20"
}

非オプショナルで指定した値が存在しない

こういうことです。

struct Sample: Codable {
    let name: String
    let age: Int
}
{
    name: "Tommy",
}

あったりなかったりするキーはオプショナルにすると、キーがなかったときはnil扱いでparse成功します。
欠落する可能性がある要素は認識合わせときましょう!!!

struct Sample: Codable {
    let name: String
    let age: Int?
}

parseエラーになりそうだけどイケる例

  • オプショナルで指定したキーに対する値がnull
  • キーの順序がランダムに返る

オプショナルで指定したキーに対する値がnull

struct Sample: Codable {
    let name: String
    let age: Int?
}
{
    name: "Tommy",
    age: null
}

小文字nullはJSONでNULL値を表す正式な記法なので、Codableでもちゃんとnil扱いにしてくれます。
ただAPI側でもNULL値の表現として、

  • null
  • キー自体を欠落
  • (Stringなら)""
  • (配列なら)[]

などの選択肢があるので、欠損時にどう突っ込むかはやはりAPI側と認識を合わせたいですね。

キーの順序がランダムに返る

今回僕がこの記事を書くきっかけになったのがこのケースでした。
漠然と順不同だと思っていたのですが、デバッグ中にコケた原因が順序っぽかったので、「Codableって順序性見るんだ〜」と誤認しました。
(よく確認したら、順番なおす過程でプロパティ名も修正していて、そっちが効いた模様)

当たり前過ぎるのか、ドキュメントに明示的に書かれてなくて、混乱しました。
結論的には順不同です。

struct Sample: Codable {
    let name: String
    let age: Int
}
{
    age: 20
    name: "Tommy",
}

まとめ

まとめると、parseエラーになる条件は下記の三つです。

  • キー名が不一致
  • 型情報が不一致
  • 非オプショナルで指定した値が存在しない

故にAPI担当者と認識合わせないといけないのは、キー名、型名、NULLがあるか/どう表現するか。
他にもこんなケースあるんじゃない? というのがあれば補足お願いします!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3