在 Swift 中处理 JSON:面向初学者的解析与序列化
\n\nJSON(JavaScript Object Notation)是现代移动和 Web 应用程序中最流行的数据交换格式。如果您正在使用 Swift 开发 iOS 或 macOS 应用,掌握 JSON 的解析与序列化是一项必备技能。在本文中,我们将介绍所有主要的 JSON 处理方法:从经典的 JSONSerialization 到现代的 Codable 协议。本教程面向已经熟悉 Swift 基础的初学者开发者。
什么是 JSON,为什么在 Swift 中需要它?
\n\nJSON 是一种基于 JavaScript 语法的文本格式。它由键值对、嵌套对象和数组组成。在 iOS 开发中,JSON 用于:
\n\n- \n
- 从 REST API 服务器获取数据 \n
- 保存应用程序的配置和设置 \n
- 在应用程序模块之间交换数据 \n
- 与数据库交互(例如 Firebase 或 CoreData + JSON) \n
在 Swift 中,处理 JSON 主要有两种方法:通过 JSONSerialization(来自 Foundation)的传统方式,以及使用 Codable、Encodable 和 Decodable 协议的现代方式。我们将从更简单的 JSONSerialization 开始,以便理解其机制,然后转向功能强大的 Codable。
使用 JSONSerialization(Foundation)解析 JSON
\n\nJSONSerialization 是 Foundation 内置的一个类,用于将 JSON 数据转换为 Swift 对象(字典和数组)。这种方法自 Swift 早期版本就已存在,至今仍在遗留项目中使用。让我们看一个例子。
假设我们有一个包含用户信息的 JSON 字符串:
\n\nlet jsonString = """\n{\n "name": "伊万",\n "age": 30,\n "email": "ivan@example.com",\n "isActive": true,\n "hobbies": ["阅读", "编程", "运动"]\n}\n"""\n\n要解析这个 JSON,我们首先将字符串转换为 Data 类型,然后使用 JSONSerialization:
import Foundation\n\nif let jsonData = jsonString.data(using: .utf8) {\n do {\n if let dictionary = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {\n print("姓名:\\(dictionary["name"] ?? "无数据")")\n print("年龄:\\(dictionary["age"] ?? "无数据")")\n if let hobbies = dictionary["hobbies"] as? [String] {\n print("爱好:\\(hobbies.joined(separator: ", "))")\n }\n }\n } catch {\n print("JSON 解析错误:\\(error.localizedDescription)")\n }\n}\n\n重要提示:
\n- \n
- 始终使用
try-catch——解析可能会抛出错误。 \n - 结果以
Any类型返回,因此需要转换为具体类型(对象用[String: Any],数组用[Any])。 \n - 选项
.mutableContainers和.fragmentsAllowed可以控制解析的灵活性。 \n
现代方法:Codable 协议
\n\n从 Swift 4 开始,Apple 引入了 Codable 协议(它结合了 Encodable 和 Decodable)。这简直是“魔法”——只需声明一个结构体,Swift 就能自动处理数据的解析和序列化。让我们用 Codable 重写前面的例子。
1. 声明数据模型
\n\nstruct User: Codable {\n let name: String\n let age: Int\n let email: String\n let isActive: Bool\n let hobbies: [String]\n}\n\n请注意:结构体中的字段名称必须与 JSON 的键名一致(区分大小写)。如果键名不同(例如使用 snake_case),请使用 CodingKeys。