一、什么是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示意图
四、部分代码示例
#import "YYViewController.h"
#import "MBProgressHUD+MJ.h"
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *pwd;
- (IBAction)login;
@end
@implementation YYViewController
- (IBAction)login {
// 1.提前的表单验证
if
(self.username.text.length==0) {
[MBProgressHUD showError:@
"请输入用户名"
];
return
;
}
if
(self.pwd.text.length==0) {
[MBProgressHUD showError:@
"请输入密码"
];
return
;
}
// 2.发送请求给服务器(带上账号和密码)
//添加一个遮罩,禁止用户操作
[MBProgressHUD showMessage:@
"正在努力加载中...."
];
//
// 1.设置请求路径
// NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
// NSURL *url=[NSURL URLWithString:urlStr];
// 1.设置请求路径
NSURL *URL=[NSURL URLWithString:@
"http://192.168.1.53:8080/MJServer/login"
];//不需要传递参数
// 2.创建请求对象
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL];
//默认为get请求
request.timeoutInterval=5.0;
//设置请求超时为5秒
request.HTTPMethod=@
"POST"
;
//设置请求方法
//设置请求体
NSString *param=[NSString stringWithFormat:@
"username=%@&pwd=%@"
,self.username.text,self.pwd.text];
//把拼接后的字符串转换为data,设置请求体
request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding];
//客户端类型,只能写英文
[request setValue:@
"ios+android"
forHTTPHeaderField:@
"User-Agent"
];
// 3.发送请求
//获取一个主队列
NSOperationQueue *queue=[NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//当请求结束的时候调用(有两种结果,一个是成功拿到数据,也可能没有拿到数据,请求失败)
[MBProgressHUD hideHUD];
if
(data) {
//请求成功
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
//判断后,在界面提示登录信息
NSString *error=dict[@
"error"
];
if
(error) {
[MBProgressHUD showError:error];
}
else
{
NSString *success=dict[@
"success"
];
[MBProgressHUD showSuccess:success];
}
}
else
//请求失败
{
[MBProgressHUD showError:@
"网络繁忙,请稍后重试!"
];
}
}];
NSLog(@
"请求发送完毕"
);
}
@end