JJ 3.1.0

JJ 3.1.0

测试已测试
Lang语言 SwiftSwift
许可 MIT
发布上次发布2016年11月
SPM支持 SPM

Yury Korolev 维护。



JJ 3.1.0

JJ

Swift 的一个非常简单的 JSON 解析器

要求

  • iOS 8.0+ / Mac OS X 10.10+ / tvOS 8.0+ / watchOS 2.0+
  • Xcode 7.3.1
  • Swift 2.2

无依赖。如果您想的话,可以将 JJ.swift 复制到您的项目中。

安装

JSON 示例

import UIKit

struct Branch {
    let branch: String
}

struct MyRepository {
    let name: String
    let desc: String
    let stargazersCount: Int
    let language: String?
    let sometimesMissingKey: String?

    let defaultBranch: Branch

    init(anyObject: AnyObject?) throws {
        let obj = try jj(anyObject).obj()
        self.name = try obj["name"].string()
        self.desc = try obj["description"].string()
        self.stargazersCount = try obj["stargazersCount"].int()
        self.language = obj["language"].asString
        self.sometimesMissingKey = obj["sometimesMissingKey"].asString

        self.defaultBranch = Branch(branch: obj["branch"].toString())
    }
}


let json = [
    "name" : "JJ",
    "description" : "Super simple json parser for Swift",
    "stargazersCount" : 999999,
    "language" : "RU",
    "sometimesMissingKey" : NSNull(),
    "branch" : "master"
]

do {
    let r = try MyRepository(anyObject: json)
} catch {
    debugPrint(error)
}

NSCoder 示例

class RepositoryAuthor: NSCoding {
    var name: String!
    var headquarters: String!

    init(name: String, headquarters: String) {
        super.init()
        self.name = name
        self.headquarters = headquarters
    }

    required convenience init?(coder aDecoder: NSCoder) {
        let dec = jj(decoder: aDecoder)

        do {
            let name = try dec["name"].string()
            let headquarters = try dec["headquarters"].string()

            self.init(name: name, headquarters: headquarters)
        } catch {
            debugPrint(error)
            return nil
        }
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.name, forKey: "name")
        aCoder.encodeObject(self.headquarters, forKey: "headquarters")
    }
}

let data = NSMutableData()
let coder = NSKeyedArchiver(forWritingWithMutableData: data)
let enc = jj(encoder: coder)

enc.put("Yury", at: "name")
enc.put("AnjLab", at: "headquarters")
coder.finishEncoding()

let decoder = NSKeyedUnarchiver(forReadingWithData: data)
let author = RepositoryAuthor(coder: decoder)

功能

  • 无协议
  • 信息丰富的错误
  • 可扩展的
  • 利用 Swift 2 的错误处理
  • 支持符合 NSCoding 的类

解析类型

  • Bool
  • Int & UInt
  • Float
  • Double
  • NSNumber
  • String
  • NSDate
  • NSURL
  • NSTimeZone
  • [AnyObject]
  • [String : AnyObject]

错误

遵循 ErrorTypeJJError,目前有两个错误结构符合它

  • 当无法转换元素时,WrongType 抛出
  • 如果元素缺失,则 NotFound 抛出
let arr = ["element"]

do {
    let _ = try jj(arr).obj()
} catch {
    print(error)
}

//  JJError.WrongType: Can't convert Optional(<_TtCs21_SwiftDeferredNSArray 0x7fa3be4acb40>(
//  element
//  )
//  ) at path: '<root>' to type '[String: AnyObject]'

错误处理

类似 .<Type>() 的表达式会直接抛出,可以使用 catch 语句创建最复杂的错误处理行为。这也意味着可以使用 try? 返回 nil 以替代抛出错误。

对于必填值,最有用的方法是 .to<Type>(defaultValue)。如果值缺失或不匹配其类型,将使用默认值。

对于可选值,有方法 .as<Type>

方法 示例 空值行为 缺失键行为 类型不匹配行为
.<Type>() .int() 抛出 抛出 抛出
.to<Type>(defaultValue) .toString().toString("默认") 默认值 默认值 默认值
.as<类型> .asObj nil nil nil
.decode() .decode() as NSNumber 抛出 抛出 抛出
.decodeAs() .decodeAs() nil nil nil

作者

尤里·柯罗列夫, [email protected]

许可协议

JJ 可在 MIT 许可协议下使用。有关更多信息,请参阅 LICENSE 文件。