Swift4 での JSON 文字列からオブジェクトへの変換方法のメモ. もっと詳しく調べたい場合は公式のドキュメントを調べた方がよい.
これからデコードするJSON
{ "id": 219038 , "name": "James Thunder" , "password": "s0r23ndsn0q3mf083259" , "created_at": "2015-04-13T14:20:32" , "email": [ { "value": "jim@example.com" , "primary": true } ] }
JSON にあわせたデータ. protocol Codable
に準じた struct
で作る
struct User: Codable { let id: Int64 let name: String let password: String let email: [Email] let created_at: String } struct Email: Codable { let value: String let primary: Bool? }
デコードするコード
let decoder = JSONDecoder() let user: User = try! decoder.decode( User.self, from: userJson.data(using: .utf8)! )
json がスネークケースだけど、オブジェクトのプロパティはキャメルケースにしたい場合は、ネスト enum を作って、 CodingKeys
protocol と String
を継承させたマッピングを作る.
struct User: Codable { let id: Int64 let name: String let password: String let email: [Email] let createdAt: String enum UserCodingKeys: String, CodingKey { case createdAt = "created_at" case id = "id" case name = "name" case password = "password" case email = "email" } }
なお JSONDecoder
の呼び出し方は同じ.
場合によっては配列で返されることもある.
let usersJson = "[\(user)]"
この場合は、 decoder.decode<T>(_ type: T.Type, from data: Data)
の呼び出し時の type:
に [User].self
を指定する
let users: [User] = try! decoder.decode( [User].self, from: usersJson.data(using: .utf8)! )