Z
ZHANK
现代 Swift

Codable 编解码

Codable JSON 序列化、CodingKeys 映射、自定义编解码

Codable 编解码

Codable = Encodable + Decodable——只需声明遵守协议,Swift 自动生成 JSON 序列化代码。

学完本章你将: 掌握 Codable JSON 序列化、CodingKeys、自定义编解码。


基本 Codable

swift
struct User: Codable {
    let name: String
    let age: Int
    let email: String
}

// JSON → 对象
let json = """
{"name": "小明", "age": 25, "email": "xm@test.com"}
""".data(using: .utf8)!

let decoder = JSONDecoder()
let user = try decoder.decode(User.self, from: json)
print(user.name)  // "小明"

// 对象 → JSON
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(user)
print(String(data: data, encoding: .utf8)!)

CodingKeys —— 自定义映射

swift
struct User: Codable {
    let name: String
    let createdAt: Date

    enum CodingKeys: String, CodingKey {
        case name
        case createdAt = "created_at"  // JSON 字段名映射
    }
}

自定义编解码

swift
struct User: Codable {
    let name: String
    let age: Int

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        // 自定义验证
        age = try container.decode(Int.self, forKey: .age)
        guard age >= 0 else { throw DecodingError.dataCorrupted(...) }
    }
}