Swiftにおける、JSONパージ時、スネークケースで渡されて面倒な対処方法
1.はじめに
- 表題のとおりなんですが、忘備録として記述です。
- キャメルケース、スネークケースについては、Google先生にて確認してください。
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)
おしまい