SwiftyJSON 源码阅读

2020-03-25  本文已影响0人  Tony17

前言

在项目开发的过程中,一定会是用到 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 做了一个桥接,把值根据类型赋值给不同的存储属性。

SwiftyJSON中实际使用的属性

核心方法就是 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/

上一篇下一篇

猜你喜欢

热点阅读