Argo 是一个库,它允许你以简洁、类型安全且易于扩展的方式从 JSON 或类似结构中提取模型。使用 Argo,你无需编写验证代码来确保传入的数据类型正确,或者确保所需的数据字段不为空。Argo 使用 Swift 具有表现力的类型系统来为你完成这些工作,并在未找到你期望的内容时报告明确的失败状态。
Argo 是希腊语中 swift(迅速)的意思,也是 Aeson 之子 Jason 和 Argonauts(阿尔戈英雄)所使用的船的名字。Aeson 是 Haskell 中的 JSON 解析库,它启发了 Argo,就像 Aeson 启发了他的儿子 Jason 一样。
请注意,我们积极地推动 master
分支与新版本的 Swift 一起前进。因此,我们强烈建议不要指向 master
分支,而是使用 我们提供的版本之一。
以下是当前 Swift 兼容性细分
Swift 版本 | Argo 版本 |
---|---|
4.X | master |
3.X | 4.X |
2.2, 2.3 | 3.X |
2.0, 2.1 | 2.X |
1.2 - 2.0 | 1.X |
1.1 | 0.3.X |
将以下内容添加到你的 Cartfile
github "thoughtbot/Argo"
然后运行 carthage update
。
请按照 Carthage 的 README 中的最新说明进行最新的安装。
请注意,如果你使用较新版本的 Argo,你将需要将 Argo.framework
和 Runes.framework
都链接到你的应用程序中。
将以下内容添加到你的 Podfile
pod 'Argo'
你还需要确保你选择使用 frameworks
use_frameworks!
然后使用 CocoaPods 0.36 或更新版本运行 pod install
。
我想如果那是你的风格,你可以这样做。
将此仓库添加为子模块,并将项目文件添加到你的工作区。然后你可以链接到应用程序目标的 Argo.framework
。
如果你使用的是较新版本的 Argo,则需要对 Runes 执行相同的操作。
请注意:下面的示例需要一个名为 Curry 的附加外部模块,它允许我们使用 curry
函数来柯里化 User.init
。
它还导入了 Runes,它是较新版本 Argo 的依赖项。如果你使用的是旧版本的 Argo,则可能不需要该导入。
import Argo
import Curry
import Runes
struct User {
let id: Int
let name: String
let email: String?
let role: Role
let companyName: String
let friends: [User]
}
extension User: Decodable {
static func decode(_ json: JSON) -> Decoded<User> {
return curry(User.init)
<^> json <| "id"
<*> json <| "name"
<*> json <|? "email" // Use ? for parsing optional values
<*> json <| "role" // Custom types that also conform to Decodable just work
<*> json <| ["company", "name"] // Parse nested objects
<*> json <|| "friends" // parse arrays of objects
}
}
// Wherever you receive JSON data:
let json: Any? = try? NSJSONSerialization.JSONObjectWithData(data, options: [])
if let j: Any = json {
let user: User? = decode(j)
}
有关更多信息,请参阅 文档
请参阅 CONTRIBUTING 文档。谢谢你,贡献者!
Argo 版权所有 (c) 2015 thoughtbot, inc. 它是免费软件,可以根据 LICENSE 文件中指定的条款进行重新分发。
Argo 由 thoughtbot, inc. 维护和资助。thoughtbot 的名称和徽标是 thoughtbot, inc. 的商标。