美文网首页
SwiftyJSON 源码阅读

SwiftyJSON 源码阅读

作者: Tony17 | 来源:发表于2020-03-25 19:30 被阅读0次

    前言

    在项目开发的过程中,一定会是用到 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/

    相关文章

      网友评论

          本文标题:SwiftyJSON 源码阅读

          本文链接:https://www.haomeiwen.com/subject/zbgxuhtx.html