用 Swift 构建一个 JSON 解析器:第 1 部分
2023-11-29 01:03:13
踏入 JSON 世界
JSON(JavaScript 对象表示法)是一种轻量级的数据格式,用于在应用程序和系统之间交换数据。它以其简洁的语法和跨平台兼容性而闻名。JSON 广泛用于网络 API、数据存储和配置管理等各种场景。
JSON 语法
JSON 由一系列键值对组成,类似于 Python 字典或 JavaScript 对象。键由字符串表示,而值可以是字符串、数字、布尔值、数组或其他嵌套对象。JSON 语法遵循以下规则:
- 对象用大括号
{}
括起来。 - 键值对由冒号
:
分隔。 - 键必须用双引号
"
括起来。 - 值可以是字符串、数字、布尔值、数组或对象。
- 数组用方括号
[]
括起来。 - 数组中的元素由逗号
,
分隔。
例如,以下 JSON 片段表示一个具有名称、年龄和爱好属性的个人信息:
{
"name": "John Doe",
"age": 30,
"hobbies": ["coding", "reading", "hiking"]
}
用 Swift 解析 JSON
创建 JSON 解析器
要解析 JSON 数据,我们可以创建一个自定义的 Swift 结构体来表示 JSON 对象的层次结构。例如,我们可以创建一个 Person
结构体来表示上面的个人信息 JSON 片段:
struct Person: Codable {
let name: String
let age: Int
let hobbies: [String]
}
此结构体符合 Codable
协议,这使我们可以使用 Swift 的内置 JSON 编码和解码功能。
使用 JSONDecoder 解析 JSON
Swift 提供了一个内置的 JSONDecoder
类来解析 JSON 数据。我们可以使用以下步骤来解析 JSON:
- 创建一个
JSONDecoder
实例。 - 指定要解析的 JSON 数据。
- 调用
decode
方法将 JSON 数据解码到指定的 Swift 类型。
例如,以下代码片段显示了如何解析上面的 JSON 字符串:
let jsonString = """
{
"name": "John Doe",
"age": 30,
"hobbies": ["coding", "reading", "hiking"]
}
"""
let decoder = JSONDecoder()
let person = try decoder.decode(Person.self, from: Data(jsonString.utf8))
print(person.name) // 输出:John Doe
自定义 JSON 解码器
在某些情况下,我们需要自定义 JSON 解码过程。例如,我们可能希望将 JSON 中的特定值转换为不同的数据类型。我们可以通过创建自定义 JSONKeyedDecoder
子类并覆盖 decode
方法来实现这一点。
例如,以下代码片段显示了如何创建一个自定义解码器,将 JSON 中的年龄值转换为 Date
类型:
class AgeDecodingStrategy: JSONKeyedDecodingStrategy {
override func decode<T>(_ type: T.Type, forKey key: CodingKey) throws -> T where T: Decodable {
let container = try super.container(forKey: key)
if type == Date.self {
let dateString = try container.decode(String.self)
return try DateFormatter().date(from: dateString) as! T
} else {
return try super.decode(type, forKey: key)
}
}
}
class CustomJSONDecoder: JSONDecoder {
override init() {
super.init()
self.keyDecodingStrategy = .custom(AgeDecodingStrategy())
}
}
let jsonString = """
{
"name": "John Doe",
"age": "1990-01-01",
"hobbies": ["coding", "reading", "hiking"]
}
"""
let decoder = CustomJSONDecoder()
let person = try decoder.decode(Person.self, from: Data(jsonString.utf8))
print(person.age) // 输出:1990-01-01 00:00:00 +0000
总结
本指南的第一部分向您介绍了 JSON 解析的基础知识,并展示了如何在 Swift 中使用 JSONDecoder
解析 JSON 数据。我们还介绍了如何自定义 JSON 解码过程以处理复杂的数据转换。在第二部分中,我们将深入了解 JSON 编码和序列化的技术,并构建一个功能齐全的 JSON 处理库。