在 Swift 中处理 JSON:面向初学者的解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Swift 中处理 JSON:面向初学者的解析与序列化

\n\n

JSON(JavaScript Object Notation)是现代移动和 Web 应用程序中最流行的数据交换格式。如果您正在使用 Swift 开发 iOS 或 macOS 应用,掌握 JSON 的解析与序列化是一项必备技能。在本文中,我们将介绍所有主要的 JSON 处理方法:从经典的 JSONSerialization 到现代的 Codable 协议。本教程面向已经熟悉 Swift 基础的初学者开发者。

\n\n

什么是 JSON,为什么在 Swift 中需要它?

\n\n

JSON 是一种基于 JavaScript 语法的文本格式。它由键值对、嵌套对象和数组组成。在 iOS 开发中,JSON 用于:

\n\n
    \n
  • 从 REST API 服务器获取数据
  • \n
  • 保存应用程序的配置和设置
  • \n
  • 在应用程序模块之间交换数据
  • \n
  • 与数据库交互(例如 Firebase 或 CoreData + JSON)
  • \n
\n\n

在 Swift 中,处理 JSON 主要有两种方法:通过 JSONSerialization(来自 Foundation)的传统方式,以及使用 Codable、Encodable 和 Decodable 协议的现代方式。我们将从更简单的 JSONSerialization 开始,以便理解其机制,然后转向功能强大的 Codable。

\n\n

使用 JSONSerialization(Foundation)解析 JSON

\n\n

JSONSerialization 是 Foundation 内置的一个类,用于将 JSON 数据转换为 Swift 对象(字典和数组)。这种方法自 Swift 早期版本就已存在,至今仍在遗留项目中使用。让我们看一个例子。

\n\n

假设我们有一个包含用户信息的 JSON 字符串:

\n\n
let jsonString = """\n{\n    "name": "伊万",\n    "age": 30,\n    "email": "ivan@example.com",\n    "isActive": true,\n    "hobbies": ["阅读", "编程", "运动"]\n}\n"""
\n\n

要解析这个 JSON,我们首先将字符串转换为 Data 类型,然后使用 JSONSerialization:

\n\n
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
\n\n

现代方法:Codable 协议

\n\n

从 Swift 4 开始,Apple 引入了 Codable 协议(它结合了 Encodable 和 Decodable)。这简直是“魔法”——只需声明一个结构体,Swift 就能自动处理数据的解析和序列化。让我们用 Codable 重写前面的例子。

\n\n

1. 声明数据模型

\n\n
struct 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。

\n\n

2. 解析 J

博客

书籍推荐