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
}
由于 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 包管理器 通过将正确的描述添加到你的 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 文件。