iOS开发网络篇—JSON介绍
一、什么是JSON
JSON是一种轻量级的数据格式,一般用于数据交互
服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
JSON的格式很像OC中的字典和数组
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
标准JSON格式的注意点:key必须用双引号
要想从JSON中挖掘出具体数据,得对JSON进行解析。即把JSON 转换为 OC数据类型
二、JSON – OC 转换对照表
对照关系
三、JSON解析方案
1.在iOS中,JSON的常见解析方案有4种
(1)第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
(2)苹果原生(自带):NSJSONSerialization(性能最好)
2.NSJSONSerialization的常见方法
(1)JSON数据 ——》 OC对象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
(2)OC对象 ——》 JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
3.解析来自服务器的JSON示意图
四、部分代码示例
1
#import
"DH
ViewController.h
"
2
#import
“MBProgressHUD+DH.h
"
3
4 @interface DHViewController ()
5
@property
(weak,
nonatomic)
IBOutlet
UITextField
*username;
6
@property
(weak,
nonatomic)
IBOutlet
UITextField
*pwd;
7
-
(IBAction)login;
8
9
@end
10
11 @implementation DHViewController
12
13
-
(IBAction)login
{
14
//
1.提前的表单验证
15
if
(self.username.text.length==
0)
{
16
[MBProgressHUD
showError:
@"
请输入用户名
"];
17
return;
18
}
19
if
(self.pwd.text.length==
0)
{
20
[MBProgressHUD
showError:
@"
请输入密码
"];
21
return;
22
}
23
//
2.发送请求给服务器(带上账号和密码)
24
//
添加一个遮罩,禁止用户操作
25
[MBProgressHUD
showMessage:
@"
正在努力加载中....
"];
26
27
//
28
//
1.设置请求路径
29
//
NSString *urlStr=[NSString stringWithFormat:@"
http://192.168.1.53
:8080/DHServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
30
//
NSURL *url=[NSURL URLWithString:urlStr];
31
32
//
1.设置请求路径
33
NSURL
*URL=[NSURL
URLWithString:
@"
http://192.168.1.53:8080/DHServer/login
"];
//
不需要传递参数
34
35
//
2.创建请求对象
36
NSMutableURLRequest
*request=[NSMutableURLRequest
requestWithURL:URL];
//
默认为get请求
37
request.timeoutInterval=
5.0;
//
设置请求超时为5秒
38
request.HTTPMethod=
@"
POST
";
//
设置请求方法
39
40
//
设置请求体
41
NSString
*param=[NSString
stringWithFormat:
@"
username=%@&pwd=%@
",self.username.text,self.pwd.text];
42
//
把拼接后的字符串转换为data,设置请求体
43
request.HTTPBody=[param
dataUsingEncoding:NSUTF8StringEncoding];
44
45
//
客户端类型,只能写英文
46
[request
setValue:
@"
ios+android
"
forHTTPHeaderField:
@"
User-Agent
"];
47
48
//
3.发送请求
49
//
获取一个主队列
50
NSOperationQueue
*queue=[NSOperationQueue
mainQueue];
51
[NSURLConnection
sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse
*response,
NSData
*data,
NSError
*connectionError)
{
52
//
当请求结束的时候调用(有两种结果,一个是成功拿到数据,也可能没有拿到数据,请求失败)
53
[MBProgressHUD
hideHUD];
54
if
(data)
{
//
请求成功
55 NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
56
//
判断后,在界面提示登录信息
57
NSString *error=dict[@"error"];
58
if
(error)
{
59
[MBProgressHUD
showError:error];
60
}
else
61
{
62
NSString
*success=dict[
@"
success
"];
63
[MBProgressHUD
showSuccess:success];
64
}
65
}
else
//
请求失败
66
{
67
[MBProgressHUD
showError:
@"
网络繁忙,请稍后重试!
"];
68
}
69
}];
70
NSLog(
@"
请求发送完毕
");
71
}
72
@end