Alamofire4.0库解析JSON数据
题外话:就目前而言swift相关的,不管是教程、知识、项目实战、开源等等都是较少的,而且在我学习相关知识的时候遇到非常多的问题,比如这个网络请求的库Alamofire,版本非常的久远....所以,我打算写一个给自己看的,也同时方便给其他学习的人了解~~~~~END - 。 -
距离上一次对这个库更新的时候已经有一段时光,现在再一次对最新版本的进行一个不算完善的解读吧。 - 。1
随着现在swift进入3.0时代,即将迎来4.0,我们使用的第三方库也是跟着语音的版本在变化。所以,在Swift开发中,我们除了用apple提供的API以外,我们还会用到很多第三方库。
额,比如说现在要介绍的这个网络请求库
Alamofire.png
关于Alamofire的历史:
如果你是用OC进行编程的,那么你肯定了解AFNetworking。
据GitHub统计AFNetworking是 iOS 和 OS X 上最受欢迎的第三方库之一。它曾在我们的2012年的读者评选中荣获2012年度最佳 iOS 库称号。它同样也在 Github 上面获得了14000多个 stars 和4000多个 forks,是使用最广的开源项目之一。
那么在我们Swift语言中当然也不能少了这样给力的第三方库,作者依旧是AFNetworking 的作者Mattt Thompson。
首先是Alamofire的地址https://github.com/Alamofire/Alamofire
其次是一个测试HTTP请求的地址http://httpbin.org
再加转模型的库ObjectMapper地址https://github.com/Hearst-DD/ObjectMapper
以上就是这次的三个主角了,接下来我们说点正事:
首先,如果你还不会使用的cocoapods的话,推荐先去学习一下cocoapods的使用,因为我们很多时候是用cocoapods来配置我们的第三方库。
首先是一般情况的请求:
这个是最新版本的请求:网上可能会有请求4个参数的版本.....
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
打印结果.png
这个是一般的请求的情况,但是这个请求方法并不严谨,通过查看Alamofire的资料可以有一个更加swift的写法:
Alamofire.request(.GET, "https://httpbin.org/get")
.responseJSON { response in
switch response.result {
case.Success(let json):
print("\(json)") //打印JSON数据
print("\(json.dynamicType)") //JSON的动态类型
let dict = json as! Dictionary<String,AnyObject>
let origin = dict["origin"] as! String
print("\(origin)")
let headers = dict["headers"] as! Dictionary<String,String>
let AcceptEncoding = headers["Accept-Encoding"]
print("\(AcceptEncoding)")
case.Failure(let error):
print("\(error)")
}
}
重点:因为使用Alamofire解析的数据中有可能有String、dictionary、array所以不管任何情况下,我们先将JSON数据转换为dictionary的String/anyobject类型在根据JSON数据中具体的类型我们开进行获取
1.首先将json数据转化为dict
2.在根据json的数据中获得String类型的origin
3.如果json数据中有dict,我们在进行一次转化为dict,类型为String和String是因为键值对是这个类型。
4.根据dict里面我们需要的数据进行取出。
5.我们就可以当做常量来使用这些数据了
这个是Alamofire的另一种写法,这种写法比原始的那种会更加严谨,判断也是从success和false来进行的。
除此之外,我们可能还会遇到另外一种情况(不管你们遇到没有,反正我是遇到了)先上图(URL和参数不方便透露)
部分截图.png这个JSON解析出来后,是一种多个数组,然后每个数组里面是字典的类型。然后当我继续天真的用同样的方法去解析的时候,程序就直接crash掉了
遇到这种JSON的解决方法如下:(方法是自己想出来不一定正确,但是肯定能得到结果)
let URL = "x"
let parameters = [x]
Alamofire.request(.GET, URL, parameters: parameters).responseJSON { (response) -> Void in
switch response.result {
case .Success(let json):
print("\(json.dynamicType)")
// print("\(json)")
// for var i = 0 ; i < json.count ; i++ {
// let dict = json[i] as! Dictionary<String,AnyObject>
// let table_name = dict["table_name"] as! String
// var array = [String]()
// array.append(table_name)
// print("\(array)")
// }
for i in 0..<json.count {
let dict = json[i] as! Dictionary<String,AnyObject>
let table_name = dict["table_name"] as! String
var array = [String]()
array.append(table_name)
print("\(array)")
}
case .Failure(let error):
print("\(error)")
}
}
上面两种方法都是正确的,第一个方法是当时忘记了swift范围的使用,然后后面才补上的。
第一个注释的方法比较好理解一点:
1.首先打印动态类型,得到了一个名字叫做NSCFArray的鬼玩意儿(自行百度QAQ)
2.分析:
- 由于是多数组里面,包涵字典的情况
- 所以应该是遍历每一个数组,然后从每一个数组中取出我们要的数据
- 然后在把取出的每一个数据放进新的数组中
- 然后使用这些数据给cell什么什么的........
3.代码
因为要遍历数组,肯定会用到for循环,在我失忆范围语法的时候
for var i = 0 ; i < json.count ; i++ {
let dict = json[i] as! Dictionary<String,AnyObject>
let table_name = dict["table_name"] as! String
var array = [String]()
array.append(table_name)
print("\(array)")
}
明显不够聪明的写法,但是也只能这样了,解释一下:
1.遍历所有JSON数据中的数组,数量是JSON数组的个数,并且转化为之前说的dict
2.获得需要的字段
3.因为是循环,所以需要把每一次获得的字段加到外部定义的array里面(不然怎么用)
4.使用array
这样就解决了我遇到的问题,以上就是我用alamofire的全部啦。
下面的大家不用看了,这个是写给自己准备的话。
期待每天我的简书吧!
使用objectMapper处理json数据
tips:目前而言,自己还是一个非常非常新的半吊子,也不知道自己哪里来的勇气靠着swift找到一份实习的工作,现在还是OC横行的时代!!!当然了进入了公司看着公司的API,根据UI给的界面,自己慢慢的进行搭建这,慢,很慢,有时候自己真的很想哭,因为有恨有怨,恨自己不是科班出身吧,自己在大学的时候没有选择自己喜欢的专业,没有认真的在大学里面深造(笔者的LOL段位是最强王者,其他的就不多说了),所以也希望看到文章的人好好的珍惜时间,多多提升自己的技能。怨,是因为自己真的很努力了,程度差不多和废寝忘食差不多吧。
前两天还获得了试用的机会有了工资,还想着存钱,今天就收到了BOSS来的消息,认为我跟不上公司的进度,让我继续学习....没有工资。但是,我确实在认真的工作啊,我也没有偷懒啊,我还是要生活,要吃饭吧!!!(本来需求就有难度,用collectionview做展开,不多说了....)╮(╯▽╰)╭,好歹我自己还是个劳动力啊,起码每顿的饭都是我在煮啊,菜都是我在炒吧,自己已经23了,还没有挣到钱。
QAQ(这个时候我已经哭了,办公室只有自己一个人。)耳机里面听的是陈奕迅的富士山下....唉。
但是我不会放弃的,我希望在过一个月的时候我可以获得一份能让自己生存的薪水吧,起码自己现在做着自己想做的事情,还有什么好说的呢,或许这段时间会成为以后聊天的话题吧。也不知道BOSS会不会看到,WHO CARE?
ENDING
I have a desire to succeed more than anyone, so I have nothing to fear. Come on.