参考原文: http://swiftcafe.io/2015/07/18/swift-json/
先抛开AFN不说,我们向服务器请求数据时,可以使用下面的方法:
let addr = "http://api.budejie.com/api/api_open.php?a=list&c=data"
let url = URL.init(string: addr)
do {
// jsonData为Data类型
let jsonData = try Data.init(contentsOf: url!)
// result为json类型
let result = try JSONSerialization.jsonObject(with: jsonData!, options: .mutableContainers) as? NSDictionary
// json有三种类型: 字典 数组 值
// 字典转模型之前首先从json对象中得到字典
let dict = result?["list"] as? NSArray
print(dict!)
} catch {
print("出错啦")
}
以上代码中的url返回的json有点大,贴出来太多,截取一部分说明一下:
{
info = {
count = 2000;
maxid = 1481784425;
maxtime = 1481784425;
page = 100;
vendor = node94;
};
list = (
{
bimageuri = "";
bookmark = 128;
"cache_version" = 2;
cai = 60;
"cdn_img" = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
comment = 56;
"create_time" = "2016-12-15 12:03:53";
"created_at" = "2016-12-16 00:48:02";
ding = 183;
favourite = 128;
hate = 60;
height = 28870;
id = 22634058;
image0 = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
image1 = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
image2 = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
t = 1481820482;
tag = "";
text = "\U54c7\U54c7\U54c7\Uff01\U798f\U5229\U6765\U4e86\Uff0c\U8001\U53f8\U673a\U5feb\U4e0a\U8f66\Uff01\U6ce2\U591a\U8001\U5e08\U9886\U885416\U540d\U5973\U4f18\U5171\U6f14\U5927\U611f\U8c22\U796d\Uff01";
"theme_id" = 0;
"theme_name" = "";
"theme_type" = 0;
}
);
})
向一个后端地址发送get或post请求,服务器返回一个json格式的数据,(或者xml,本文为json),可以使用JSONSerialization类来将Data类型的数据转化为json对象:
let result = try JSONSerialization.jsonObject(with: jsonData!, options: .mutableContainers) as? NSDictionary
关于这个类的讲解可以看本文开头给出的链接。
JSON 数据分为三种形式,对象,数组,值。
如果我们的 JSON 根节点是以对象形式存放的,那么我们得到的就是一个 NSDictionary。而如果是以数组形式存放的,那么我们得到的就是一个 NSArray。
JSON中大括号括起来的是json对象,中括号括起来的是数组。
iOS开发中处理json数据一般是为了字典转模型,即NSDictionary转自定义Model,所以操作第一步是拿到json数据,之后将json转化为NSDictionary或者NSArray ,
然后的操作就是字典转模型了。
以AFN为例,地址还是上面给出的地址,返回的json也是一样的:
let url = "http://api.budejie.com/api/api_open.php"
var data = [String : String]()
data["a"] = "list"
data["c"] = "data"
let af = AFHTTPSessionManager()
af.get(url, parameters: data, progress: nil, success: { (_, jsonData) in
let resultJson = jsonData as? NSDictionary // json对象
let listArr = resultJson?["list"] as? NSArray // json数组
let infoArr = resultJson?["info"] as? NSDictionary
}, failure: { (_, error) in
print(error)
})
以上代码中AFN的get方法就已经是服务器返回的json数据了,然后根据这个json数据的格式判断转为NSDictionary还是NSArray ,转为cocoa的对象后,接下来的操作就容易了~