示例1:
- JSON
let jsonData: Data = """
{
"name": "MonkeyBread",
"address": "China",
"email": "12345@gamil.com",
}
""".data(using: .utf8)!
- Model
struct User: Codable {
let name: String
let address: String
let email: String
}
- 解析
let user = try? JSONDecoder().decode(User.self, from: jsonData)
JSON 與 Model 完全一致城丧,這是最基礎(chǔ)的 JSON 解析。
示例2:
- JSON
let jsonData: Data = """
{
"name": "MonkeyBread",
"email": "12345@gamil.com",
"addr": {
"country": "China",
"city": "Beijing",
"lat": "123",
"lng": "456",
}
}
""".data(using: .utf8)!
- Model
struct Address: Codable {
let country: String
let city: String
let latitude: String
let longitude: String
}
struct User: Codable {
let userName: String
let email: String
let address: Address
}
- 解析
struct Address: Codable {
let country: String
let city: String
let latitude: String
let longitude: String
private enum CodingKeys: String, CodingKey {
case country
case city
case latitude = "lat"
case longitude = "lng"
}
}
struct User: Codable {
let userName: String
let email: String
let address: Address
private enum CodingKeys: String, CodingKey {
case userName = "name"
case email
case address = "addr"
}
}
let user = try? JSONDecoder().decode(User.self, from: jsonData)
JSON 與 Model 不一致的情況,可通過(guò) CodingKeys 枚舉對(duì)應(yīng)腹尖,多層嵌套的情況也同樣適用狮荔。
需要注意的是:如果重寫(xiě) CodingKeys enum 需要包含 Model 中所有屬性。
示例3:
- JSON
let jsonData: Data = """
{
"name": "MonkeyBread",
"email": "12345@gamil.com",
"addr": {
"country": "China",
"city": "Beijing",
"lat": "123",
"lng": "456"
}
}
""".data(using: .utf8)!
- Model
struct User: Codable {
let userName: String
let email: String
let country: String
let city: String
let latitude: String
let longitude: String
}
- 解析:
struct User: Codable {
var userName: String = ""
var email: String = ""
var country: String = ""
var city: String = ""
var latitude: String = ""
var longitude: String = ""
private enum UserKeys: String, CodingKey {
case userName = "name"
case email
case addr
}
private enum AddressKeys: String, CodingKey {
case country
case city
case latitude = "lat"
case longitude = "lng"
}
init(from decoder: Decoder) throws {
if let userContainer = try? decoder.container(keyedBy: UserKeys.self) {
self.userName = try userContainer.decode(String.self, forKey: .userName)
self.email = try userContainer.decode(String.self, forKey: .email)
if let addressContainer = try? userContainer.nestedContainer(keyedBy: AddressKeys.self, forKey: .addr) {
self.country = try addressContainer.decode(String.self, forKey: .country)
self.city = try addressContainer.decode(String.self, forKey: .city)
self.latitude = try addressContainer.decode(String.self, forKey: .latitude)
self.longitude = try addressContainer.decode(String.self, forKey: .longitude)
}
}
}
}
if let user = try? JSONDecoder().decode(User.self, from: jsonData) {
print(user.userName)
print(user.email)
print(user.country)
print(user.latitude)
print(user)
}
示例中的 addr 參數(shù)包含了地理位置信息贫贝,一般情況都會(huì)按照 示例2 的方式解析秉犹,但如果項(xiàng)目中僅用到了 country 參數(shù)蛉谜,創(chuàng)建 Address 類來(lái)接收參數(shù)就顯得很累贅了,此示例就是將 addr 參數(shù)與 User 參數(shù)合并成了一層崇堵,省去了 Address 類型诚。