JSON Parsing
1. Codable Model
struct User: Codable, Identifiable {
let id: Int
let name: String
let email: String
}2. Nested JSON
struct Response: Codable {
let status: String
let data: DataWrapper
}
struct DataWrapper: Codable {
let users: [User]
}
// Decode
let response = try JSONDecoder().decode(Response.self, from: data)
let users = response.data.users3. Custom Keys
struct Post: Codable {
let id: Int
let title: String
let createdAt: Date
enum CodingKeys: String, CodingKey {
case id
case title
case createdAt = "created_at"
}
}4. Date Decoding
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
// Custom format
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
decoder.dateDecodingStrategy = .formatted(formatter)5. Snake Case
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase6. Optional và Default Values
struct Item: Codable {
let id: Int
let name: String
let description: String? // Optional
// Default value
var quantity: Int = 1
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id)
name = try container.decode(String.self, forKey: .name)
description = try container.decodeIfPresent(String.self, forKey: .description)
quantity = try container.decodeIfPresent(Int.self, forKey: .quantity) ?? 1
}
}📝 Tóm tắt
| Strategy | Mục đích |
|---|---|
CodingKeys | Map property names |
.convertFromSnakeCase | snake_case → camelCase |
.iso8601 | Parse ISO dates |
decodeIfPresent | Optional values |
Last updated on