SwiftyJSON 源码阅读
前言
在项目开发的过程中,一定会是用到 JSON 这样的数据格式,关于 JSON 格式的前世今生已经与其他格式的横向对比这里就不展开了。随着 JSON 格式的流行,如何优雅安全的解析并使用 JSON 就成了一件非常重要的事情。在 Swift 中,SwiftJSON 是一个非常流行的 JSON 解析库,今天来学习一下 SwiftyJSON 这个库的实现。
内部实现
这个库只有一个文件,依托于 JSON 这个结构体来实现我们需要的功能等。使用这个库非常简单,只要调用 JSON(data)
这句代码就可以把 任意类型的数据转换成 JSON 格式。如果转换失败的话会有相应的提示。经过封装的数据可以通过 type
属性来查看当前数据的类型,而且提供了可选类型和强制类型两种取值方式,需要注意的是对于强制类型而言会有一个默认值。
其实这个库提供了多个初始化方法,但是最后都是调用到 public init(_ object: Any)
这个方法,这个方法里做了一个判断,如果传入的值是 Data 类型的话,会使用系统提供的 JSONSerialization 先把 数据转为 Json 对象在调用 fileprivate init(jsonObject: Any)
方法。
这个库的转换思路是通过递归的方式来给每个值做转化,这里通过计算属性 object
做了一个桥接,把值根据类型赋值给不同的存储属性。
核心方法就是 unwrap
方法,下面贴一下方法内容:
switch unwrap(newValue) {
case let number as NSNumber:
if number.isBool {
type = .bool
rawBool = number.boolValue
} else {
type = .number
rawNumber = number
}
case let string as String:
type = .string
rawString = string
case _ as NSNull:
type = .null
case nil:
type = .null
case let array as [Any]:
type = .array
rawArray = array
case let dictionary as [String: Any]:
type = .dictionary
rawDictionary = dictionary
default:
type = .unknown
error = SwiftyJSONError.unsupportedType
}
private func unwrap(_ object: Any) -> Any {
switch object {
case let json as JSON:
return unwrap(json.object)
case let array as [Any]:
return array.map(unwrap)
case let dictionary as [String: Any]:
var d = dictionary
dictionary.forEach { pair in
d[pair.key] = unwrap(pair.value)
}
return d
default:
return object
}
}
最后
以上就是本篇的内容,势必会有一些遗漏和错误的地方,欢迎斧正~
参考
https://swiftcafe.io/2015/07/28/swiftyJSON-explore/
https://www.cnblogs.com/strengthen/p/10709048.html
https://swiftcafe.io/2015/10/27/cafe-time-swifty-json/