SwiftのCodableでJSONのキー名が合わないときの設定
SwiftでJSONを Codable に変換するとき、APIのキー名とSwiftのプロパティ名が合わないことがあります。
よくあるのは、JSONが snake_case、Swift側が camelCase のケースです。
keyDecodingStrategyを使う
JSONが単純なsnake_caseなら、JSONDecoder の keyDecodingStrategy を使えます。
struct User: Decodable {
let userId: Int
let displayName: String
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
この設定で、次のJSONを読めます。
{
"user_id": 1,
"display_name": "Makonote"
}
個別に CodingKeys を書かなくてよいので、単純な変換ならこれで十分です。
Appleの JSONDecoder.KeyDecodingStrategy の説明はこちらです。
https://developer.apple.com/documentation/foundation/jsondecoder/keydecodingstrategy
CodingKeysを使う
キー名が単純なsnake_caseではない場合は、CodingKeys を書きます。
struct User: Decodable {
let id: Int
let name: String
enum CodingKeys: String, CodingKey {
case id = "user_id"
case name = "display_name"
}
}
API側のキー名が不規則な場合や、Swift側の名前を大きく変えたい場合はこちらです。
Dateの変換も別で見る
JSONの日付文字列を扱う場合は、キー名とは別に dateDecodingStrategy を設定します。
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
キー名の変換と日付の変換は別の問題として見た方が分かりやすいです。
まとめ
Codableでキー名が合わないときは、まず変換規則が単純かを見ます。
- snake_caseからcamelCaseなら
.convertFromSnakeCase - 不規則なキー名なら
CodingKeys - 日付の変換は
dateDecodingStrategy - 変換ルールを混ぜすぎない
APIの形式が安定しているなら、CodingKeys で明示した方が読みやすいこともあります。


