DynamicJSON 是一个基于 Swift 4.2 中由 Chris Lattner 引入的全新 @dynamicMemberLookup
功能构建的动态类型 JSON 解析器。这使我们能够访问在运行时解析的任意对象成员,使 Swift 在处理 JSON 时与 JavaScript 一样灵活。
之前
if let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
let user = jsonObject["user"] as? [String: Any],
let username = user["username"] as? String {
// ...
}
之后
let username = JSON(data).user.username.string
安装
pod 'DynamicJSON', '~> 2.0'
(如果遇到问题,请运行 pod repo update
并重试)
github "saoudrizwan/DynamicJSON"
- 或者将
DynamicJSON.swift
拖放到您的项目中。
并在您想要使用它的文件中导入 import DynamicJSON
。
使用
🐣
1. 初始化将任何东西扔进一个 JSON
对象开始使用
let json = JSON(Data())
JSON(123)
JSON(["key": "value"])
JSON(["element", 1])
JSON("Hello world")
JSON(false)
...或将文字值转换为 JSON
let json = "Hello world" as JSON
123 as JSON
[1, 2, 3] as JSON
let user: JSON = [
"username": "Saoud",
"age": 21,
"address": [
"zip": "12345",
"city": "San Diego"
]
]
⛏
2. 深入挖掘像在 JavaScript 世界一样处理 JSON
对象
let dictionary = json.dictionary
let array = json[0].cars.array
let string = json.users[1].username.string
let nsnumber = json.creditCard.pin.number
let double = json[3][1].height.double
let int = json[0].age.int
let bool = json.biography.isHuman.bool
注意 JSON
实际上并没有 cars
或 users
这样的属性,而是使用动态成员查找遍历相关的 JSON 数据来找到你想要的对象。
如果你有一个实际的 JSON 属性作为键,比如 number
或 description
,只需使用字符串下标访问器,如下所示
let number = json.account.contact["number"].number
let description = json.user.biography["description"].string
3. 享受乐趣 🤪
JSON
遵循 Comparable
let json1 = JSON(jsonData1)
let json2 = JSON(jsonData2)
// Equality applies to all types (Dictionary, Array, String, NSNumber, Bool, NSNull)
let isEqual = json1 == json2
// Less/greater than only applies to NSNumbers (Double, Int) and Strings
let isLessThan = json1 < json2
let isLessThanOrEqual = json1 <= json2
let isGreaterThan = json1 > json2
let isGreaterThanOrEqual = json1 >= json2
用于调试的美观打印
print(json)
转换为原始对象
let anyObject = json.object
转换为 Data
let data = json.data() // optionally specify options...
授权
DynamicJSON 使用 MIT 许可证。如果您有任何问题,或者希望分享您如何使用 DynamicJSON,请提交问题。
贡献
DynamicJSON 处于初期阶段,但为 Swift 中处理 JSON 提供了一种革命性的全新方法。请随意提交任何您认为可以增强 DynamicJSON 和其理念的特性的拉取请求。
有问题吗?
请通过以下邮箱
值得关注的部分
- 保罗·哈德森(Paul Hudson)关于
@dynamicMemberLookup
的出色文学作品 - 克里斯·拉特纳(Chris Lattner)的Swift Evolution提案SE-0195
- SwiftyJSON使我更好地了解了社区对JSON解析器的要求
- 赫尔杰·赫希(Helge Heß)帮助
在v2.0.0之前 消除了使用可选链的需要remove the need to use optional chaining (before v2.0.0)