本屌使用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,欢迎大家加入。
网友评论