返回

用 Swift 构建一个 JSON 解析器:第 1 部分

IOS

踏入 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:

  1. 创建一个 JSONDecoder 实例。
  2. 指定要解析的 JSON 数据。
  3. 调用 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 处理库。