仕事してて混乱してしまったので、整理します。
サンプル
基本はこんな使い方をしますよね。
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があるか/どう表現するか。
他にもこんなケースあるんじゃない? というのがあれば補足お願いします!