おひとり

できる限りひとりで楽しむための情報やプログラミング情報など。

【Swift 5】スネークケースのJSONをCodingKeyを使わずにデコードする方法

WebAPIから取得したJSONのキーはスネークケースにになっていることが多いです。
一方で、Swiftの変数等の命名はキャメルケースで行います。その場合、Decodableに準拠した構造体でもうまく読み込めません。
既存の方法ではCodingKeyを利用しますが、いちいち定義するのは面倒です。
今回はCodingKeyを利用せずにKeyがスネークケースのJSONをデコードする方法を紹介します。

.keyDecodingStrategyを設定する

JSONをデコードして構造体に変換する際、JSONDecorderクラスを利用します。
その際、.keyDecodingStrategy.convertFromSnakeCaseを設定することで、キーをスネークケースでパースすることができます。

import UIKit

struct User: Decodable {
    let mailAddr: String
}

let jsonStr = """
    {"mail_addr":"ohitori@example.com"}
"""

let data = jsonStr.data(using: .utf8)!
let decorder = JSONDecoder()
decorder.keyDecodingStrategy = .convertFromSnakeCase // キーをスネークケースでパースする設定

do {
    let user = try decorder.decode(User.self, from: data)
    print(user.mailAddr)
} catch {
    print("Error: \(error)")
}

上記のコードをXcodeのSwift playgroundで実行すると、不具合なくohitori@example.comが表示されます。

f:id:hitoridehitode:20190616162725j:plain