Foundation — JSONEncoder & JSONDecoder

JSONEncoderJSONDecoder 是 Swift Foundation 框架中用于实现 JSON 数据与 Swift 对象之间序列化与反序列化 的核心工具。它们基于 Codable 协议,提供了高效且类型安全的 JSON 处理能力。


核心概念 #

  • Codable 协议
    CodableEncodableDecodable 的类型别名。任何遵循 Codable 的类型均可被编码为 JSON 或从 JSON 解码。

    struct User: Codable {
        var name: String
        var age: Int
    }
    
  • JSONEncoder
    将 Swift 对象转换为 JSON 数据(Data 类型)。

  • JSONDecoder
    将 JSON 数据解析为 Swift 对象。


JSONEncoder 使用方法 #

基本编码 #

let user = User(name: "Alice", age: 30)
let encoder = JSONEncoder()

do {
    let jsonData = try encoder.encode(user)
    let jsonString = String(data: jsonData, encoding: .utf8)
    // 输出:{"name":"Alice","age":30}
} catch {
    print("编码失败: \(error)")
}

配置编码策略 #

encoder.keyEncodingStrategy = .convertToSnakeCase  // 键名转为蛇形命名(如 user_id)
encoder.dateEncodingStrategy = .iso8601           // 日期格式化为 ISO 8601
encoder.outputFormatting = .prettyPrinted          // 输出格式化后的 JSON

JSONDecoder 使用方法 #

基本解码 #

let jsonString = """
{"name":"Bob","age":25}
"""
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()

do {
    let user = try decoder.decode(User.self, from: jsonData)
    print(user.name) // 输出:Bob
} catch {
    print("解码失败: \(error)")
}

配置解码策略 #

decoder.keyDecodingStrategy = .convertFromSnakeCase  // 蛇形命名转为驼峰命名(如 user_id → userId)
decoder.dateDecodingStrategy = .iso8601             // 解析 ISO 8601 日期

接口说明 #

JSONEncoder 关键属性 #

属性说明
keyEncodingStrategy键名编码策略(如蛇形命名、自定义转换)
dateEncodingStrategy日期编码策略(如 ISO 8601、时间戳)
dataEncodingStrategyData 类型的编码策略(如 Base64)
outputFormattingJSON 输出格式(如缩进、排序键)

JSONDecoder 关键属性 #

属性说明
keyDecodingStrategy键名解码策略
dateDecodingStrategy日期解码策略
dataDecodingStrategyData 类型的解码策略

使用场景 #

1. 网络请求与响应 #

  • 将 API 返回的 JSON 数据解析为 Swift 模型对象。
  • 将请求参数对象编码为 JSON 数据。

2. 本地数据持久化 #

  • 将对象保存为 JSON 文件(如用户配置、缓存数据)。
  • 从 JSON 文件恢复对象状态。

3. 跨平台数据交换 #

  • 与 Web 前端、其他语言(如 Python、JavaScript)交换数据。

4. 动态配置加载 #

  • 从 JSON 配置文件中读取应用设置(如主题、API 端点)。

注意事项 #

1. 类型一致性 #

  • JSON 字段与 Swift 模型的属性必须类型兼容。例如:JSON 中的 "123"(字符串)无法直接解码为 Int 类型。

2. 可选值处理 #

  • 若 JSON 中可能缺失某些字段,需将对应属性声明为可选类型
    struct User: Codable {
        var nickname: String?  // 允许为 nil
    }
    

3. 日期与数据格式 #

  • 明确指定日期格式策略(如 .iso8601),避免因格式不匹配导致解析失败。
  • 二进制数据(Data)默认使用 Base64 编码。

4. 键名映射 #

  • 若 JSON 键名与 Swift 属性名不一致,需通过 CodingKeys 枚举自定义映射:
    struct User: Codable {
        var userId: Int
    
        enum CodingKeys: String, CodingKey {
            case userId = "user_id"
        }
    }
    

5. 错误处理 #

  • 始终使用 try-catch 捕获可能的编解码错误:
    do {
        let user = try decoder.decode(User.self, from: jsonData)
    } catch let DecodingError.dataCorrupted(context) {
        print("数据损坏:\(context.debugDescription)")
    } catch let DecodingError.keyNotFound(key, context) {
        print("键未找到:\(key.stringValue), 路径:\(context.codingPath)")
    }
    

6. 性能优化 #

  • 对于频繁编解码的场景,可复用 JSONEncoderJSONDecoder 实例以减少开销。

总结 #

JSONEncoderJSONDecoder 是 Swift 中处理 JSON 数据的标准工具,通过合理配置策略与遵循 Codable 协议,可实现高效、安全的序列化与反序列化。重点注意类型匹配、错误处理和自定义映射规则,以确保数据转换的准确性。

本文共 1200 字,创建于 Apr 20, 2025
相关标签: Xcode, Foundation, Swift