Argo
Argo 是一个库,让您能以简洁、类型安全和易于扩展的方式从 JSON 或类似结构中提取模型。使用 Argo,您无需编写验证代码来确保传入的数据类型正确,或确保必需的数据字段不是空的。Argo 使用 Swift 的表达式类型系统为您完成这些工作,并在未找到所需内容时报告明确失败状态。
Argo 是希腊语中 swift 的意思,也是 Aeson 的儿子 Jason 所使用的船的名字。Aeson 是 Haskell 中的 JSON 解析库,它启发了 Argo,就像 Aeson 启发了他儿子 Jason 一样。
版本兼容性
请注意,我们非常积极地推动 master
和 Swift 的新版本。因此,我们强烈建议不要指向 master
,而是使用我们提供的 一个发布版本。
以下是当前 Swift 兼容性的分解
Swift 版本 | Argo 版本 |
---|---|
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 |
安装
Carthage
请将以下内容添加到您的 Cartfile 中。
github "thoughtbot/Argo"
然后运行 carthage update
。
有关最新的安装说明,请遵循 Carthage 的 README 文档 中的指示。
注意:如果您正在使用更新的 Argo 版本,您需要同时将 Argo.framework
和 Runes.framework
链接到您的应用中。
CocoaPods
请将以下内容添加到您的 Podfile 中。
pod 'Argo'
请确保已选择使用框架。
use_frameworks!
然后使用 CocoaPods 0.36 或更高版本运行 pod install
。
Git Submodules
如果你喜欢这种方式的话,可以这样操作。
将此仓库作为子模块添加,并将项目文件添加到工作区中。然后,您可以针对您的应用目标链接到 Argo.framework
。
如果您正在使用更新的 Argo 版本,需要以相同方式操作 Runes。
使用小结 tl;dr
请注意:以下示例需要一个额外的外部模块,名为 Curry,它使我们能够使用 curry
函数 currying 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. 的商标。