HandyJson解析模型文档请移步:HandyJson,阿里巴巴出品,目前2k多星
本文章githubDemo代码
摘抄一段介绍:
HandyJSON是一个用于Swift语言中的JSON序列化/反序列化库。
与其他流行的Swift JSON库相比,HandyJSON的特点是,它支持纯swift类,使用也简单。它反序列化时(把JSON转换为Model)不要求Model从NSObject继承(因为它不是基于KVC机制),也不要求你为Model定义一个Mapping函数。只要你定义好Model类,声明它服从HandyJSON协议,HandyJSON就能自行以各个属性的属性名为Key,从JSON串中解析值。
HandyJSON目前依赖于从Swift Runtime源码中推断的内存规则,任何变动我们将随时跟进。
进入正题: 封装我们的Alamofire:
这里只是简单的封装,一般接口返回的都是json格式的,所以使用responseJSON这个方法就可以了
import Alamofire
let api_baseUrl = ""
class ARNetworkTool {
@discardableResult class func post(url: String,baseUrl: String = api_baseUrl,params: [String: Any]?,success: ((Any)->())?,failure: ((Error)->())?) -> DataRequest?{
guard let ar_url = URL(string: baseUrl+url) else {
return nil
}
return Alamofire.request(ar_url, method: .post, parameters: params, encoding: URLEncoding(), headers: nil).responseJSON { (data) in
///如果成功的话,result.value是一个已经解析好的字典
///失败的会有error可以回去错误信息
if data.result.isSuccess {
if let _data = data.value {
success?(_data)
}else{
success?([:])
}
}else{
failure?(data.error!)
}
}
}
}
根据接口返回的内容来实现响应的模型,比如我的接口返回的json格式是:
{
"code": "10200",
"message": "成功",
"data": [
{
"user_id": 81,
"sex": 0,
"age": 15,
"number": "xx123456",
"identification": "123456789123456",
"job": "php开发",
"real_name": "文文"
}
]
}
实现的响应模型 这样可以
class EKBaseResponse: HandyJSON {
var code: Int = 0 // 服务端返回码
var message: String = ""
public required init() {}
}
class EKDataResponse<T: HandyJSON>: EKBaseResponse {
var data: [T] = [T]()
}
class EKKVDataRespone<T: HandyJSON>: EKBaseResponse {
var data: T?
}
/// 模型基类 创建模型的时候继承 可以不用import HandyJSON
class EKBaseModel: HandyJSON ,EKResponseProtocol{
required init () {}
}
class UserModel: EKBaseModel {
// "user_id": 81,
var user_id = 0
// "sex": 0,
var sex = 0
// "age": 15,
var age = 0
// "number": "xx123456",
var number = ""
// "identification": "123456789123456",
var identification = ""
// "job": "php开发",
var job = ""
// "real_name": "文文"
var real_name = ""
}
然后 定义一个协议,只要遵守了我们的协议的模型,调用协议方法,就会得到包裹我们模型数组(或者模型本身,根据实际情况定义)的response类
protocol EKResponseProtocol {
}
extension EKResponseProtocol where Self : HandyJSON {
static func request(with url: String,params: [String:Any]?,success:((EKDataResponse<Self>)->())?,failure:((String)->())?) {
ARNetworkTool.post(url: url, params: params, success: { (data) in
guard let dict = data as? [String : Any] else {
failure?("模型解析失败")
return
}
guard let dataRp = EKDataResponse<Self>.deserialize(from: dict) else {
failure?("模型解析失败")
return
}
success?(dataRp)
}) { (error) in
failure?("失败原因")
}
}
}
然后网络请求如下:
UserModel.request(with: "", params: nil, success: { (rp) in
print(rp.code)
print(rp.message)
print(rp.data.toJSONString())
}, failure: nil)
///控制台输出:
// 10200
// 成功
// Optional("[{\"real_name\":\"文文\",\"job\":\"php开发\",\"age\":15,\"number\":\"xx123456\",\"user_id\":81,\"identification\":\"123456789123456\",\"sex\":0}]")
简单一步到位