Swiftにおける、JSONパージ時、スネークケースで渡されて面倒な対処方法

1.はじめに

2.バージョン

  • Xcode12
  • Swift 5.0
  • GitHubなし(そのままコピペで使えるよ)

3.キャメルケースで受信した時

APIで受信したときに、APIフォーマットがキャメルケースであった場合。 簡単に言うと、そのまんま使えた場合。

import Foundation

struct Response: Codable {
    /// 名前
    let firstName: String
    /// 名字
    let lastName: String
}

/// 受信データ
var json = """
{
"firstName": "山田",
"lastName": "太郎"
}
"""

let data = json.data(using: .utf8)!

/// デコード処理
let model = try! JSONDecoder().decode(Response.self, from: data)

print(model)

4.JSONDecoderのパラメータには、スネークケースで受信する方法がある

let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase

上記でエンコードする。 ただ、これだけだと自動的に使えないので、受信する構造体に、CodingKeyを派生させたenumを切っておく。以下みたいな感じ

struct Response: Codable {
    /// 名前 [first_name]
    let firstName: String
    /// 名字 [last_name]
    let lastName: String

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
    }
}

5.まとめると

以下にような実装で、自動的に、APIがスネークケースで返信してきても、コード側としてはキャメルケースの構造体で使用可能となる。あーら便利 (知っていれば、大した話しでないのだけれどねぇ)

import Foundation

struct Response: Codable {
    /// 名前 [first_name]
    let firstName: String
    /// 名字 [last_name]
    let lastName: String

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
    }
}

/// 受信データ
var json = """
{
"first_name": "山田",
"last_name": "太郎"
}
"""

let data = json.data(using: .utf8)!

/// デコード処理
let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
let model = try! jsonDecoder.decode(Response.self, from: data)

print(model)

おしまい