CodableJSON

SPM compatible

Swift 中的 JSON 处理,本应如此简单。

要求

用法

Codable 盛行的时代,我们很少需要手动处理 JSON 数据。尽管如此,有时我们无法预先知道结构,但仍然可以利用 Codable 使我们的工作更轻松。

例如,加载 JSON 数据时

{
  "Apple": {
    "address": {
      "street": "1 Infinite Loop",
      "city": "Cupertino",
      "state": "CA",
      "zip": "95014"
    },
    "employees": 132000
  }
}

以前

你需要执行大量的类型转换才能获取内部值。

guard let companies = try JSONSerialization.jsonObject(with: companiesData) as? [String: Any] else { return }

if let company = companies["Apple"] as? [String: Any],
    let address = company["address"] as? [String: Any],
    let city = address["city"] as? String {
    print("Apple is in \(city)")
}

更改内部值也需要进行多次类型转换。

guard var companies = try JSONSerialization.jsonObject(with: companiesData) as? [String: Any] else { return }

if var apple = companies["Apple"] as? [String: Any],
    var address = apple["address"] as? [String: Any] {
    address["state"] = "California"
    apple["address"] = address
    companies["Apple"] = apple
}

使用 CodableJSON

由于 JSON 具有固定的类型集,因此无需以冗长的形式执行所有这些类型转换。 CodableJSON 使用 enum 来存储每种类型。 在一些辅助函数的帮助下,访问 JSON 值现在变得更加简短和容易。

let companies = try JSONDecoder().decode(JSON.self, from: companiesData)

if let city = companies["Apple"]?["address"]?["city"]?.stringValue {
    print("Apple is in \(city)")
}

你甚至可以使用可变形式来更改内部值。 例如,你可以将状态更改为其全名

var companies = try JSONDecoder().decode(JSON.self, from: companiesData)

companies["Apple"]?["address"]?["state"] = "California"

安装

Swift 包管理器

你可以使用 Swift 包管理器 通过将正确的描述添加到你的 Package.swift 文件来安装 CodableJSON

import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    targets: [],
    dependencies: [
        .package(url: "https://github.com/guykogus/CodableJSON.git", from: "1.2.0")
    ]
)

接下来,像这样将 CodableJSON 添加到你的目标依赖项中

.target(
    name: "YOUR_TARGET_NAME",
    dependencies: [
        "CodableJSON",
    ]
),

然后运行 swift package update

许可证

CodableJSON 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。