美文网首页iOS大法好
Swift 简陋实现JSON序列化

Swift 简陋实现JSON序列化

作者: YJ_Wong | 来源:发表于2018-08-30 15:35 被阅读91次

本屌使用Objective-C多年仍能维持温饱,所以Swift发布多年依然没怎么使用过。近期观察国际大环境都已经偏向Swift作为主流,甚至有相当公司明确要求使用RxSwift之类,再不学一点感觉温饱都要成问题了。

本文介绍客户端应用JSON时会遇到 Object转JSON、JSON转Object的情况。以往使用Objective-C时可以使用runtime闭着眼睛用脚轻松实现。Swift中使用稍有不同,也就是 " Mirror "的应用。

Object转JSON

//Get request Parameters from request object
    static func getParametersFromObject(obj:NSObject) -> Parameters {
        var result:[String:Any] = [:]
        
        //Use Mirror fetch all value
        let mirror:Mirror = Mirror(reflecting: obj)
        
        if mirror.children.count > 0 {
            for children in mirror.children {
                let propertyNameString = children.label!
                let value = children.value
                //Set Value for Key
                result[propertyNameString] = value;
            }
        }
        return result
    }

在使用Alamofire和SwiftJSON搭配后,使用此段代码return出的Parameters可以直接传入parameters使用。

Alamofire.request(requestObj.sURL, method: .get, parameters: body, encoding: URLEncoding.default, headers: headerFile)

JSON转Object

    public func fillWithJson(json:JSON) -> Void {
        for (key,value):(String,JSON) in json
        {
            //Ignore UnDefine Key
            if isIncludeKey(key: key) {
              //Array暂时没用到 以后再说
                switch value.type{
                case .string:
                    self.setValue(value.string, forKey: key)
                    break;
                case .number:
                    self.setValue(value.number, forKey: key)
                    break;
                case .dictionary:
                    self.fillWithJson(json: value)
                    break;
                default:
                    break;
                }
            }
        }
    }
    
    func isIncludeKey(key:String) -> Bool {
        let mirror:Mirror = Mirror(reflecting: self)
        
        if mirror.children.count > 0 {
            for children in mirror.children {
                let propertyNameString = children.label!
                if propertyNameString == key {
                    return true
                } else {
                    //continue
                }
            }
        }
        return false
    }

fillWithJson方法没什么好说的,就是一个简单的kvc的应用。当解析到dictionary类型时使用递归进行解析,属性也无外乎就是string number这些。
fillWithJson方法是用于处理本地实体和服务端json不一致的情况。例如服务端给的东西非常多,本地只需要使用部分属性是,该方法可以避免给不存在的属性进行赋值导致失败。如果你不存在这种情况,可以不实现该方法。

以上两个就是最简单(简陋)的序列化应用,可以满足我当前也同样简单(简陋)的使用场景。后期如有进化会贴新文章进行介绍。

建了Swift的QQ交流群 859978655,欢迎大家加入。

相关文章

网友评论

    本文标题:Swift 简陋实现JSON序列化

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