解析JSON并且字典转模型以及如何在项目内用

1、SwiftyJSON+Alam导入到项目内

2、由于Alam发送POST请求是异步的不能及时返回数据,要把Alam简单封装下,让他能够及时返回数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func httpsPost(success:((json:AnyObject)->Void)?,failure:((error:NSError)->Void)?){
Alamofire.request(.POST).responseJSON(options: NSJSONReadingOptions.MutableContainers) { (request, response, json, error) -> Void in
if error == nil {
if success != nil {
println(json)
success!(json: json!)
}
} else {
if failure != nil {
failure!(error: error!)
}
}
}
}

第一个参数url为网络地址,后面success为请求成功的闭包,第二个failure为请求失败的闭包

第一行为Alam自带的request封装好的发送网络请求的方法,POST请求以及url。后面的responesJSON这个并不是Alam自带的,而是依靠SwiftyJSON的一个解析返回数据的JSON方法,options那个没太注意是干嘛的而且我也没用到过,后面request,response,json,error,前两个对数据来说没啥用,json就是咱要取的发送post请求以后后台返回的数据,如果返回失败(譬如url请求错误、或者参数不对又或者哪里有错误)error为一个错误信息。

Void in后面为咱们要处理的

①首先判断error是不是为nil 注:如果发送POST请求返回数据OK的话 error是为nil的

②其次判断success是否为nil 这个就是一个闭包的保险写法 我也有点蒙为啥那么写,但是我感觉会比较保险点

③正题来了json就是咱们要的东东,success要加! ,json:json !为返回的闭包参数son:AnyObject (具体代码怎么用后面会说)

④else 就是肯定error非nil了,非nil得话肯定报错,那么failure闭包就有作用了,返回erro错误信息

注:这个的封装不加任何参数,如果加参数可以这样

1
func requestMethod3(method:Alamofire.Method,url:String,model:String,params:[NSObject:AnyObject],success:((Json:[String:AnyObject]?)->Void)?,failure:((error:NSError)->Void)?)

参数 Alamofire.Method.POST or Alamofire.Method.GET、url可以传地址,model也是一个String参数,params为一个字典

下面介绍如何去运用自己封装好的网络请求

1
2
3
4
5
6
7
8
var easyRequest = EasyRequest()
func easyRequestNormalAndProduct(){
EasyRequest.httpsPost(Alamofire.Method.POST, url: FAVORITE_FAVORITE_FAVCOUNT_URL, model: FAVORITE_MODEL, params: parameters, success: { (Json) -> Void in
println(Json)
}, failure: { (error) -> Void in
println(error)
})
}

在第五行输出的Json就可以提取数据了(参数按照自己的需求自己拼接去)

OK 如果这个时候Json可以println 那么恭喜你 你已经会Alam发送网络请求以及接收到Alam返回的数据了

那么next咱得把数据解析出来~

我这边输出的Json如下

1
Optional(["code": 0, "list": <4,6,0x7f9b13263db0>,[0x7f9b1322e1d0--8] [0x7f9b132447b0--8] [0x7f9b13230ff0--8] [0x7f9b10d71710--8] [0x7f9b13260a20--8] [0x7f9b13222960--8] ])

image
是的 你TMD在逗我?后面那一坨一坨是个蛋蛋啊?

聪明又帅气的二挠哥告诉你正常,只要返回数据了就正常~表急

下面来个一行代码轻松搞定

var channel = JSON(Json!)

那么再输出下就是如下信息了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
{
"code" : 0,
"list" : [
{
"normal_video_play_count" : 1,
"normal_video_id" : "1284",
"publish_date" : "1435218376",
"fav_date" : "1435634888",
"type" : 2,
"normal_video_title" : "9999 ooooo i",
"normal_video" : "http:\/\/testqiniu.xiudou.net\/VvPiEDnTp1FVcfW6FrWJX-nJnbU=\/Fm8IAWT2B9MrFTqrnEn_ZABLagIJ?pm3u8\/0\/expires\/86400&e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:-Yy2m0OyxN4NVux7xUuiqV6h5nc=",
"normal_video_head_image" : "http:\/\/testqiniu.xiudou.net\/videos\/shop\/1429777564_1435218364.jpg?e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:ufP9NHZy-9ChMkpzFNN_8Jfdt6s="
},
{
"normal_video_play_count" : 1,
"normal_video_id" : "1285",
"publish_date" : "1435219543",
"fav_date" : "1435634831",
"type" : 2,
"normal_video_title" : "sdfasdfdsaf",
"normal_video" : "http:\/\/testqiniu.xiudou.net\/VvPiEDnTp1FVcfW6FrWJX-nJnbU=\/Fm8IAWT2B9MrFTqrnEn_ZABLagIJ?pm3u8\/0\/expires\/86400&e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:-Yy2m0OyxN4NVux7xUuiqV6h5nc=",
"normal_video_head_image" : "http:\/\/testqiniu.xiudou.net\/videos\/shop\/1429777564_1435219536.jpg?e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:XPCR5XTwQ8oeDGLuNFdtwrucsGQ="
},
{
"normal_video_play_count" : 4,
"normal_video_id" : "1282",
"publish_date" : "1435218102",
"fav_date" : "1435634819",
"type" : 2,
"normal_video_title" : "呵呵",
"normal_video" : "http:\/\/testqiniu.xiudou.net\/VvPiEDnTp1FVcfW6FrWJX-nJnbU=\/FiHtlkir3PNQbVK8JD5w5U96EpU4?pm3u8\/0\/expires\/86400&e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:OgSLxsJIbcTNSZMl40HXJKd5zO4=",
"normal_video_head_image" : "http:\/\/7xjo8a.com2.z0.glb.qiniucdn.com\/normal\/1434427831_1435218100.jpg?e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:9TkEBtRvF2DHaGyDKDtHv7ryqu8="
},
{
"normal_video_play_count" : 4,
"normal_video_id" : "1224",
"publish_date" : "1434020670",
"fav_date" : "1435564145",
"type" : 2,
"normal_video_title" : "",
"normal_video" : "http:\/\/testqiniu.xiudou.net\/PjhrU4kwRDaU1YNTE_8kapZMa4o=\/Fm8IAWT2B9MrFTqrnEn_ZABLagIJ?pm3u8\/0\/expires\/86400&e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:rQ8KIr5og7apuD4LGNtFvb30Ooo=",
"normal_video_head_image" : "http:\/\/testqiniu.xiudou.net\/shop_videos\/shop\/1429777564_1434020650.jpg?e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:e004eIn52ZY68IFmN9ZvhNMHptM="
},
{
"normal_video_play_count" : 7,
"normal_video_id" : "1263",
"publish_date" : "1434443695",
"fav_date" : "1434542812",
"type" : 2,
"normal_video_title" : "也要好好和",
"normal_video" : "http:\/\/testqiniu.xiudou.net\/VvPiEDnTp1FVcfW6FrWJX-nJnbU=\/FrvIsJaH3xCJQ8a7TlMwRvVyCph8?pm3u8\/0\/expires\/86400&e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:_FQOC8YioYREAuRG1oPJOfGmu4U=",
"normal_video_head_image" : "http:\/\/7xjo8a.com2.z0.glb.qiniucdn.com\/normal\/1433837202_1434443640125.jpg?e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:CngLb_rPEYvuAouMbP0iJbKbqUI="
},
{
"normal_video_play_count" : 14,
"normal_video_id" : "1254",
"publish_date" : "1434438070",
"fav_date" : "1434542808",
"type" : 2,
"normal_video_title" : "vbjj",
"normal_video" : "http:\/\/testqiniu.xiudou.net\/VvPiEDnTp1FVcfW6FrWJX-nJnbU=\/FtfIY7z-FAShdNiuBnmG0kpwefjk?pm3u8\/0\/expires\/86400&e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:hcVZdnu1riz88z_AWlAqIRFIzns=",
"normal_video_head_image" : "http:\/\/7xjo8a.com2.z0.glb.qiniucdn.com\/normal\/1428903622_1434438045781.jpg?e=1435769541&token=TS8CH53g7f8gjytpyRGRwG4MFOua4FSwZ5g1O_L7:uVk6IxqL0ARWzIIEzphhN4LKORY="
}
]
}

OK看到这里你就算是认识了把,简单的JSON,你理解为键值对也行~!反正我总是理解成键值对~!。。。。。

OK那么下一步取出具体的数据

首先提取

提取的话其实SwiftyJSON都给大家封装的很好了直接调用即可

如上图我如果想取code和list

那么直接

1
2
3
4
var code = channel["code"].int
//此时输出code 为0 因为返回的数据就为0
var array = channel["list"].array
//此时的list是包含了list:后面那些很多数据的数组

到此OK了JSON数据提取OK了,能正常的println了


那么这里咱先做点别的~!什么呢?建立Model(不懂model得自己百度MVC去)

首先建立对应返回数组也就是上面的array。我的对应的如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//
// NormalModel.swift
//
//
// Created by 二挠 on 15/6/26.
// Copyright (c) 2015年 . All rights reserved.
//

import Foundation

class NormalModel{

var publish_date:String!
var normal_video_id:Int!
var normal_video_title:String!
var normal_video:String!
var normal_video_head_image:String!
var video_play_count:Int!
var fav_date: String!
var fav_type:Int!

func initModel(dict:NSDictionary)->AnyObject{
publish_date = dict.valueForKey("publish_date") as! String
normal_video_id = dict.valueForKey("normal_video_id") as! Int
normal_video_title = dict.valueForKey("normal_video_title") as! String
normal_video = dict.valueForKey("normal_video") as! String
normal_video_head_image = dict.valueForKey("normal_video_head_image") as! String
video_play_count = dict.valueForKey("normal_video_play_count") as! Int
fav_date = dict.valueForKey("fav_date") as! String
fav_type = dict.valueForKey("type") as! Int
return self
}
}

那么对应返回JSON的实体类就建立好了。

解释下 很简单一个名字为NormalModel的实体类,里面一个方法名字为initModel的带NSDictionary参数的方法,方法内部去把接收的字典取Key对应的value然后赋值给属性。

对象建完了那么下面就该是如何给对象赋值了,还记得上面已经获取到array了么?what?你TMD忘了 么事 二挠哥带你装逼带你飞 再来复习下

1
2
3
4
5
6
7
8
9
10
println(Json)
//Json为闭包返回的json变量,JSON为SwiftyJSON自带的
var channel = JSON(Json!)
println(channel)
var code = channel["code"].int
//此时输出code 为0 因为返回的数据就为0
var array = channel["list"].array
//此时的list是包含了list:后面那些很多数据的数组
//新建一个可变数组来添加数据
var tempArray = NSMutableArray()

然后去循环array给这个类传一个NSDictionary即可。具体做法

1
2
3
4
for e in array! {
var cc = NormalModel().initModel(NSDictionary(dictionary:e.dictionaryObject!) as [NSObject : AnyObject])
tempArray.addObject(cc)
}

貌似到这里就完了 其实还有一个尾巴~~~啥?闭包有两个,一个success就是咱们要处理这个、还一个failure木有处理直接如下

1
2
3
failure: { (error) -> Void in
println(error)
}

那么现在基本就完成 90%了
到此为止了?NONO

下面介绍如何运用,既然都存到Model里了总得用吧?

拿UICollectionView来说吧在

cellForItemAtIndexPath方法内

1
2
3
4
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var nor = NormalModel()
nor = swiftMultiPage.dataArray[indexPath.row] as! NormalModel
}

这时候的nor就已经存了第一条数据了 不信你po nor.favDate来爽爽?