LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-08

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)

おしまい

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2