SwiftのCodableでJSONのキー名が合わないときの設定

SwiftでJSONを Codable に変換するとき、APIのキー名とSwiftのプロパティ名が合わないことがあります。

よくあるのは、JSONが snake_case、Swift側が camelCase のケースです。

keyDecodingStrategyを使う

JSONが単純なsnake_caseなら、JSONDecoderkeyDecodingStrategy を使えます。

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 で明示した方が読みやすいこともあります。

参考