测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可 | Apache 2 |
发布上次发布 | 2017年11月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✓ |
由 Dalton Cherry 维护。
将 JSON 转换为 Swift 对象。Objective-C 的对应工具可以在这里找到:JSONJoy。
在 Swift 中解析 JSON 有时会让人联想到穿越莫德罗的旅程,而 JSONJoy 就像是这次旅程中的老鹰。
Swift 4 的发布带来了对新的 Codable
协议的支持。这使得 JSONJoy 的大部分功能不再必要,因此将被弃用。3.0.2 版本已更新以支持 Swift 4,作为向后兼容的手段,但我鼓励采用新的 Codable
协议。我在这里写了一篇关于这个主题的文章这里
首先导入框架。参考安装说明了解如何将框架添加到您的项目中。
import JSONJoy
以下是一些我们需要解析的示例 JSON。
{
"id" : 1,
"first_name": "John",
"last_name": "Smith",
"age": 25,
"address": {
"id": 1,
"street_address": "2nd Street",
"city": "Bakersfield",
"state": "CA",
"postal_code": 93309
}
}
我们希望将此 JSON 转换为以下 Swift 对象
struct Address {
let objID: Int?
let streetAddress: String?
let city: String?
let state: String?
let postalCode: String?
init() {
}
}
struct User {
let objID: Int?
let firstName: String?
let lastName: String?
let age: Int?
let address = Address()
init() {
}
}
通常这将使我们陷入验证噩梦
var user = User()
var error: NSError?
var response: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(), error: &error)
if let userDict = response as? NSDictionary {
if let addressDict = userDict["address"] as? NSDictionary {
user.address.city = addressDict["city"] as? String
user.address.streetAddress = addressDict["street_address"] as? String
//etc, etc
}
user.firstName = userDict["first_name"] as? String
user.lastName = userDict["last_name"] as? String
//etc, etc
}
JSONJoy 使这简单得多。我们在 Swift 对象中实现了 JSONJoy 协议
struct Address : JSONJoy {
let objID: Int
let streetAddress: String
let city: String
let state: String
let postalCode: String
let streetTwo: String?
init(_ decoder: JSONLoader) throws {
objID = try decoder["id"].get()
streetAddress = try decoder["street_address"].get()
city = try decoder["city"].get()
state = try decoder["state"].get()
postalCode = try decoder["postal_code"].get()
streetTwo = decoder["street_two"].getOptional()
//just an example of "checking" for a property.
if let meta: String = decoder["meta"].getOptional() {
print("found some meta info: \(meta)")
}
}
}
struct User : JSONJoy {
let objID: Int
let firstName: String
let lastName: String
let age: Int
let address: Address
let addresses: [Address]
init(_ decoder: JSONLoader) throws {
objID = try decoder["id"].get()
firstName = try decoder["first_name"].get()
lastName = try decoder["last_name"].get()
age = try decoder["age"].get()
address = try Address(decoder["address"])
addresses = try decoder["addresses"].get() //infers the type and returns a valid array
}
}
然后当我们得到 JSON 返回时
do {
var user = try User(JSONLoader(data))
println("city is: \(user.address.city)")
//That's it! The object has all the appropriate properties mapped.
} catch {
print("unable to parse the JSON")
}
这也有与大多数 Swift JSON 库相似的自动可选验证。
//some randomly incorrect key. This will work fine and the property will just be nil.
firstName = decoder[5]["wrongKey"]["MoreWrong"].getOptional()
//firstName is nil, but no crashing!
如果您想扩展标准 Foundation 类型(您可能不需要这样做)
extension UInt64: JSONBasicType {}
这可以与 SwiftHTTP 结合使用,使 API 交互非常清晰和简单。
https://github.com/daltoniam/SwiftHTTP#clientserver-example
JSONJoy 至少需要 iOS 7/OSX 10.10 或更高版本。
将项目添加为您的 Package.swift 依赖项
import PackageDescription
let package = Package(
name: "YourProject",
dependencies: [
.Package(url: "https://github.com/daltoniam/JSONJoy-Swift", majorVersion: 3)
]
)
首先查看安装文档了解如何安装 Rogue。
要安装 JSONJoy,请在创建 rogue 文件的目录中运行以下命令。
rogue add https://github.com/daltoniam/JSONJoy-Swift
接下来,打开 libs
文件夹,将 JSONJoy.xcodeproj
添加到您的 Xcode 项目中。完成后,在“构建阶段”中,将 JSONJoy.framework
添加到“链接二进制与库”阶段。请确保将 libs
文件夹添加到您的 .gitignore
文件中。
只需获取框架(通过 git 子模块或其他包管理器)。
将 JSONJoy.xcodeproj
添加到您的 Xcode 项目中。完成后,在“构建阶段”中,将 JSONJoy.framework
添加到“链接二进制与库”阶段。
如果您在OSX应用程序或物理iOS设备上运行此程序,您需要确保将包含在应用程序包中的JSONJoy.framework添加到程序中。为此,在Xcode中,单击蓝色项目图标,然后在侧边栏的“目标”标题下选择应用程序目标。在窗口顶部的标签栏中,打开“构建阶段”面板。展开“链接二进制与库”组,并添加JSONJoy.framework。单击面板左上角的加号按钮,选择“新复制文件阶段”。将这个新阶段重命名为“复制框架”,将“目的地”设置为“框架”,并添加JSONJoy.framework。
JSONJoy遵循Apache v2许可