在swift开发中,发起网络请求大部分开发者应该都是使用Alamofire发起的网络请求,至于请求完成后JSON解析这一块有很多解决方案,我们今天这里使用HandyJSON来解析请求返回的数据并转化成模型

关于HandyJSON,是由阿里一位大神推出的,能够做到JSON转Model一步到位,而且使用起来,非常简洁方便 传送门:https://github.com/alibaba/HandyJSON

具体的用法我们通过一个例子来解析:

import HandyJSON

enum AjaxResultState:Int,HandyJSONEnum {
case success = 0 //成功
case sessionError = 97 //登录失败
case errrorMessage = 99
case error = 100 //错误
} class AjaxResult: HandyJSON {
var code : AjaxResultState = .success
var message : String?
var datas : Any?
var userId : String?
// @objc var my_date : Int = 0{
// willSet {
// print("newValue: ", newValue)
// }
// didSet {
// print("oldValue: ", oldValue)
// }
// } //重写set方法
@objc var handleTime : Int = 0{
willSet {
print("newValue: ", newValue)
}
} //转换数据完成
func didFinishMapping() {
self.userId = "234324324"
} func mapping(mapper: HelpingMapper) {
//字段替换
//mapper.specify(property: &my_date, name: "handleTime")
} required init() { }
}

需要注意的点:

  • 我们创建的类不需要继承HandyJSON
  • 可以实现mapping方法做字段的替换,有点像MJExtension里面的mj_replacedKeyFromPropertyName这个方法
    func mapping(mapper: HelpingMapper) {
//字段替换
mapper.specify(property: &my_date, name: "handleTime")
}
  • 实现方法didFinishMapping可以在字典模型完成之后做对解析的字段做额外处理,类似MJExtension中mj_keyValuesDidFinishConvertingToObject
    func didFinishMapping() {
self.userId = "234324324"
}
  • 可以重写模型中某个属性的set方法和get方法,但前提需要继承自NSObject
class AjaxResult: NSObject,HandyJSON {
@objc var my_date : Int = 0{
willSet {
print("newValue: ", newValue)
}
didSet {
print("oldValue: ", oldValue)
}
}
required override init() { }
} class ContentModel: HandyJSON {
required init() { }
var title : String?
}
  • 字典转模型的使用
var dict = [String: Any]()
dict["doubleOptional"] = 1.1
dict["stringImplicitlyUnwrapped"] = "hello"
dict["int"] = 1
if let object = BasicTypes.deserialize(from: dict) {
// ...
}
  • 模型转字典
let object = BasicTypes()
object.int = 1
object.doubleOptional = 1.1
object.stringImplicitlyUnwrapped = “hello" print(object.toJSON()!) // serialize to dictionary
print(object.toJSONString()!) // serialize to JSON string
print(object.toJSONString(prettyPrint: true)!) // serialize to pretty JSON string
  • 有枚举或者有结构体
enum AnimalType: String, HandyJSONEnum {
case Cat = "cat"
case Dog = "dog"
case Bird = "bird"
} struct Animal: HandyJSON {
var name: String?
var type: AnimalType?
} let jsonString = "{\"type\":\"cat\",\"name\":\"Tom\"}"
if let animal = Animal.deserialize(from: jsonString) {
print(animal.type?.rawValue)
}

关于Alamofire我不多说了,熟悉AFNetworking的朋友都知道Alamofire是AFNetworking的swift版本详细的用法请参考 https://github.com/Alamofire/Alamofire

具体使用我这里封装了一个工具类

import UIKit
import Alamofire
import HandyJSON class HttpRequestUtil: NSObject { typealias HttpSuccess = ((_ result:AjaxResult) -> Void)
static func request( method:HTTPMethod,url:URLConvertible,parameters:Parameters? = nil,success:@escaping HttpSuccess){
Alamofire.request(url, method:method, parameters:parameters).responseJSON(completionHandler: { (response) in
if response.result.isSuccess {
if let jsonString = response.result.value {
//将返回的JSON数据转换成AjaxResult模型的数据并将AjaxResult对象传回
if let obj = AjaxResult.deserialize(from: jsonString as? Dictionary){
success(obj)
}else{
let ajax = AjaxResult()
ajax.code = .error
success(ajax)
}
}
}else{
let ajax = AjaxResult()
ajax.code = .error
success(ajax)
}
})
}
}

工具类的使用

       HttpRequestUtil.request(method: .get, url: "https://cs.hxquan.cn/api/ad/list", parameters: ["spaceId":"4"]) { (result) in
if result.code == .success {
//将字典数组转换成ContentModel的模型数组
if let datas = Array<ContentModel>.deserialize(from: result.datas as? NSArray){
print(datas)
//[Optional(t1.ContentModel),
//Optional(t1.ContentModel),
//Optional(t1.ContentModel),
//Optional(t1.ContentModel),
//Optional(t1.ContentModel),
//Optional(t1.ContentModel)]
}
}
}

转载请标注来源:https://www.cnblogs.com/qqcc1388/p/9851376.html

iOS swift HandyJSON组合Alamofire发起网络请求并转换成模型的更多相关文章

  1. android4.0 HttpClient 以后不能在主线程发起网络请求

    android4.0以后不能在主线程发起网络请求,该异步网络请求. new Thread(new Runnable() { @Override public void run() { // TODO ...

  2. [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. swift 第十课 cocopod 网络请求 Alamofire

    这个 cocopod 真的是不容易,差点就放弃了…… 还好,我足够的坚持…… 还是首先说下具体的步骤,希望能记得足够的详细…… 1.打开终端,cd 到自己项目的文件夹 cd 文件路径 2.执行 vim ...

  4. Swift使用Alamofire实现网络请求

    Alamofire是一个用Swift编写的HTTP网络库,由此前热门开源项目AFNetworking的的作者mattt开发,可非常简单地用于异步网络通信. 要获取最新版本的 Alamofire,前往h ...

  5. Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp

    前言: IOS的文章,今天,再来补一篇,Sagit的教程: 虽然感觉IOS的文章没什么观众,还是努力写吧,-_-〜 Sagit 开源地址:https://github.com/cyq1162/Sagi ...

  6. 使用axios优雅的发起网络请求

    原文链接:https://www.jianshu.com/p/73585303fdc0 公司项目使用了vue作为技术栈,便理所应当地使用了官方推荐的axios进行网络请求,这里记录下axios的封装方 ...

  7. 木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求

    摘自:http://kczxsp.hnu.edu.cn/upload/20150504165623705.pdf 里面对于木马的实验过程写得非常清楚,值得一看.   木马是隐藏在正常程序中的具有特殊功 ...

  8. iOS:根据日志去定位网络请求发生的错误是由于服务端造成的,还是客户端造成的?

    一.介绍 在项目开发中,服务端和客户端的协作尤为重要,而连接它们的最重要的环节之一就是网络请求,对于服务端而言,如果这个环节出现了错误,那么安全性就无从谈起,同时对于客户端而言,如果这个模块出现了错误 ...

  9. [iOS微博项目 - 3.3] - 封装网络请求

    github: https://github.com/hellovoidworld/HVWWeibo   A.封装网络请求 1.需求 为了避免代码冗余和对于AFN框架的多处使用导致耦合性太强,所以把网 ...

随机推荐

  1. nginx最大并发连接数的思考:worker_processes、worker_connections、worker_rlimit_nofile

    参考nginx官网:http://nginx.org/en/docs/ngx_core_module.html#worker_connections 从用户的角度,http 1.1协议下,由于浏览器默 ...

  2. linux:ls、ls -l、ls -al区别 示例

    linux:ls.ls -l.ls -al区别 示例 比如test文件夹下有一个test文件.一个.文件夹.一个..文件夹. 则,执行三个命令后,显示效果如下: [root@linuxserver t ...

  3. 安装PIL的坑

    今天在centos中使用pip安装PIL死活不成功,报错: Could not find a version that satisfies the requirement PIL (from vers ...

  4. (转)IntelliJ IDEA下的使用git

    1.git简介 Git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...

  5. 关于jquery的on,你怎么绑定就怎么解除

    打开jquery3.0一看,竟然把一大半的时间绑定的东西都废弃了 基本上绑定时间可以统一成了on,不管你是不是动态进来的dom节点 live我们知道1.7的时候就已经废弃了,还在觉得live很好用的同 ...

  6. 基于SpringBoot的Environment源码理解实现分散配置

    前提 org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性.Envi ...

  7. 【leetcode】Reorder List (python)

    问题的思路是这样: 循环取头部合并,事实上也能够换个角度来看,就是将后面的链表结点,一次隔空插入到第一部分的链表中. class Solution: # @param head, a ListNode ...

  8. CentOS修复grub

    grub启动项损坏无法进入系统. 进入grub模式(可借助安排盘rescue后在shell中输入grub). 一:     通过下面三个命令中的一个.找到正确的grub位置.     1. find ...

  9. linux ps查看进程命令详解

    http://linux.net527.cn/Linuxwendang/xitongguanliyuan/39094.htmlLinux操作系统PS命令详细解析 要对系统中进程进行监测控制,用 ps ...

  10. Android Studio Note

    1.中文乱码 很多同学都安装了Android Studio,但是发现中文是乱码,其实这个很好解决的.在IDE里点击File,选择Settings...快捷键是Ctrl+alt+s 在打开的窗口中,找到 ...