JSONのデータをSwiftで変換する際にCodingKey
を使用する方法を学んだのですが、調べているとCodingKey
を使用しない方法もあったのでメモ
例として、QiitaのAPIを取得しています。
CodingKey
を使用する場合
API用の構造体の中にenum
を定義する必要があります。
struct Qiita: Codable {
let title: String
let createdAt: String
let user: User
enum CodingKeys: String, CodingKey {
case title = "title"
case createdAt = "created_at"
case user = "user"
}
}
struct User: Codable {
let name: String
enum CodingKeys: String, CodingKey {
case name = "name"
}
}
・CodingKey
を使用しない場合
構造体内でenum
を宣言してcamelCaseに変更する代わりに、API取得時に.keyDecodingStrategy
に.convertFromSnakeCase
を代入して変換します。
構造体
struct Qiita: Codable {
let title: String
let createdAt: String
let user: User
}
struct User: Codable {
let name: String
}
enum
が無くなりスリムになりました。
API取得用メソッド
func getQiitaApi() {
guard let url = URL(string: "https://qiita.com/api/v2/items?page=1&per_page=5") else { return }
var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
print("(1)情報の取得に失敗しました:", error)
return
}
if let data = data {
do {
let jsonDecoder = JSONDecoder()
//snake_caseをcamelCaseにデコードするように指示
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
let qiita = try jsonDecoder.decode([Qiita].self, from: data)
print(qiita)
} catch {
print("(2)情報の取得に失敗しました:", error)
}
}
}
task.resume()
}
}
情報の取得に成功すると、取得したQiitaの記事タイトル、作成日、作成者の名前がログに出力されます。