Created
June 8, 2017 05:41
-
-
Save rizumita/b0c396eb526e8011b281a2984f55923a to your computer and use it in GitHub Desktop.
Swift4のCodableでフラットなJSONからネストしたオブジェクトにデコードしてみた。値は取得できたけど、これで正しい方法なのかな? #swift #CodePiece
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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