JSONMapper 0.3

JSONMapper 0.3

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2015年8月
SPM支持 SPM

Robert Palmer 维护。



  • Robert Palmer

JSONMapper 是处理 Swift 中 json 数据的一种简单方法。

要求

  • Swift 2
  • Xcode 7 beta 6

示例

´´´swift import Foundation import JSONMapper

let json = "["

let data = json.dataUsingEncoding(NSUTF8StringEncoding) let reposObject = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0))

let repos = Decode(content: reposObject) ´´´

访问值

´´´swift var name: String name = try! repos[0]["name"].decode() name = try! repos[0]["name"]~ ´´´

值可以通过索引方法访问。索引方法的返回类型是 DecodeValue。decode() 方法或 '~' 后缀运算符将值解码为推断的类型。

´´´swift let ownerId: Int = try! repos[0]["owner"]["id"]~ let privateRepo: Bool = try! repos[0]["private"]~ let urlString: String = try! repos[0]["url"]~ ´´´

返回类型推断自分配给它的变量的类型。该类型必须实现 Decodable 协议。JSONMapper 为 String、Int、Bool 和 Float 实现了该协议。

结构体、类和枚举类型可以被扩展以成为 'Decodable'。

Foundation.framework 中的类

´´´swift extension NSURL: Decodable { public static func decode(value: DecodeValue) throws -> Self? { return self.init(string: try value.decode()) } }

let url: NSURL = try! repos[0]["url"]~ ´´´

枚举

´´´swift enum OwnerType: String { case User = "User" case Admin = "Admin" }

extension OwnerType: Decodable { static func decode(value: DecodeValue) throws -> OwnerType? { return OwnerType(rawValue: try value.decode()) } }

let type: OwnerType = try! repos[0]["owner"]["type"]~ ´´´

结构体

´´´swift struct Owner { let login: String let id: Int let avatarURL: NSURL let type: OwnerType let siteAdmin: Bool }

extension Owner: Decodable { static func decode(value: DecodeValue) throws -> Owner? {

    return try Owner(login: value["login"]~,
        id: value["id"]~,
        avatarURL: value["avatar_url"]~,
        type: value["type"]~,
        siteAdmin: value["site_admin"]~)
}

}

struct Repo { let id: Int let owner: Owner let name: String let isPrivate: Bool let url: NSURL }

extension Repo: Decodable { static func decode(value: DecodeValue) throws -> Repo? {

    return try Repo(id: value["id"]~,
                 owner: value["owner"]~,
                  name: value["name"]~,
             isPrivate: value["private"]~,
                   url: value["url"]~)
}

}

声明 r 为 Repo 类型的数组:r: [Repo] = try! repos~

打印 r[0].name 和 r[0].owner.avatarURL

错误

当预期的返回类型不是 'Decodable' 时,代码将无法编译。

以下代码将无法编译:swift // will not compile let s: UIView = Decode(content: "a string").decode() ´´´

当一个值无法解码到特定类型时,decode 方法将抛出错误。

以下代码示例发生了错误处理:´´´swift do { let s: String = try repos[0]["private"]~ } catch let error { print(error) }

类似地,以下代码尝试获取 "name" 键的值:do { let s: String = try repos["name"]~ } catch let error { print(error) }

尝试获取数组的第一个元素的值并处理错误:do { let s: String = try repos[0][0]~ } catch let error { print(error) } ´´´

此外,当字典或数组中找不到键时,decode 方法也会抛出错误。

以下代码尝试获取 "not_defined" 键的值并处理错误:´´´swift do { let s: String = try repos[0]["not_defined"]~ } catch let error { print(error) }

尝试获取数组的第二个元素并处理错误:do { let s: String = try repos[1]~ } catch let error { print(error) } ´´´

当推断的返回类型是可选时,将忽略错误,并返回 nil。

以下代码示例:´´´swift let s: String? = try repos[1]~ ´´´

如果推断的类型是可选,但应该抛出错误,可以将返回类型强制转换为非可选。

以下代码示例:´´´swift do { let s: String? = try repos[1]~ as String } catch let error { print(error) } ´´´

另一方面,如果推断的类型不是可选,但可能失败,可以使用 ?? 运算符提供一个默认值。

以下代码示例:´´´swift let s2: String = try repos[1]~ ?? "default" ´´´

如果返回类型是数组,则无法解码的值将从数组中省略。

以下代码示例:´´´swift let arrayValue = Decode(content: [ 1, 2, "3", 4])

以下代码示例将解码数组到不同类型:let intArray: [Int] = try! arrayValue~ let stringArray: [String] = try! arrayValue~ let urlArray: [OwnerType] = try! arrayValue~ ´´´

安装

一些其他的 JSON 库和灵感来源