JSONJoy-Swift 3.0.3

JSONJoy-Swift 3.0.3

测试已测试
Lang语言 SwiftSwift
许可 Apache 2
发布上次发布2017年11月
SwiftSwift 版本3.0
SPM支持 SPM

Dalton Cherry 维护。



JSONJoy

将 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

这可以与 SwiftHTTP 结合使用,使 API 交互非常清晰和简单。

https://github.com/daltoniam/SwiftHTTP#clientserver-example

要求

JSONJoy 至少需要 iOS 7/OSX 10.10 或更高版本。

安装

Swift 包管理器

将项目添加为您的 Package.swift 依赖项

import PackageDescription

let package = Package(
    name: "YourProject",
    dependencies: [
        .Package(url: "https://github.com/daltoniam/JSONJoy-Swift", majorVersion: 3)
    ]
)

Rogue

首先查看安装文档了解如何安装 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许可

联系方式

Dalton Cherry