JSONEncoder
和 JSONDecoder
是 Swift Foundation 框架中用于实现 JSON 数据与 Swift 对象之间序列化与反序列化 的核心工具。它们基于 Codable
协议,提供了高效且类型安全的 JSON 处理能力。
核心概念 #
Codable
协议Codable
是Encodable
和Decodable
的类型别名。任何遵循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、时间戳) |
dataEncodingStrategy | Data 类型的编码策略(如 Base64) |
outputFormatting | JSON 输出格式(如缩进、排序键) |
JSONDecoder 关键属性 #
属性 | 说明 |
---|---|
keyDecodingStrategy | 键名解码策略 |
dateDecodingStrategy | 日期解码策略 |
dataDecodingStrategy | Data 类型的解码策略 |
使用场景 #
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. 性能优化 #
- 对于频繁编解码的场景,可复用
JSONEncoder
和JSONDecoder
实例以减少开销。
总结 #
JSONEncoder
和 JSONDecoder
是 Swift 中处理 JSON 数据的标准工具,通过合理配置策略与遵循 Codable
协议,可实现高效、安全的序列化与反序列化。重点注意类型匹配、错误处理和自定义映射规则,以确保数据转换的准确性。