Skip to content

Instantly share code, notes, and snippets.

@rizumita
Created June 8, 2017 05:41
Show Gist options
  • Save rizumita/b0c396eb526e8011b281a2984f55923a to your computer and use it in GitHub Desktop.
Save rizumita/b0c396eb526e8011b281a2984f55923a to your computer and use it in GitHub Desktop.
Swift4のCodableでフラットなJSONからネストしたオブジェクトにデコードしてみた。値は取得できたけど、これで正しい方法なのかな? #swift #CodePiece
import Foundation
struct User: Codable {
struct Address: Codable {
let street: String
let city: String
let state: String
}
let name: String
let address: Address
private enum UserCodingKeys: String, CodingKey {
case name
case address
}
private enum AddressCodingKeys: CodingKey {
case street
case city
case state
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: UserCodingKeys.self)
name = try container.decode(String.self, forKey: .name)
let addressContainer = try decoder.container(keyedBy: AddressCodingKeys.self)
let street = try addressContainer.decode(String.self, forKey: .street)
let city = try addressContainer.decode(String.self, forKey: .city)
let state = try addressContainer.decode(String.self, forKey: .state)
address = Address(street: street, city: city, state: state)
}
}
let data = """
{
"name": "rizumita",
"street": "1-2-3 Foo",
"city": "Bar",
"state": "Baz"
}
""".data(using: .utf8)!
let decoder: JSONDecoder = JSONDecoder()
do {
let user: User = try decoder.decode(User.self, from: data)
print(user)
} catch {
print(error.localizedDescription)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment