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 // 输出格式化后的 JSONJSONDecoder 使用方法#
基本解码#
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 协议,可实现高效、安全的序列化与反序列化。重点注意类型匹配、错误处理和自定义映射规则,以确保数据转换的准确性。