一、什么是JSON
JSON是一种轻量级的用于交换结构化信息的数据格式。
JSON的数据格式与Objective-C中得NSDictionary很相似,如下代码片段所示
{
"person":{
"firstName":"John",
"lastName":"Jones",
"email":{
"emailAddr":"xxxxx@xxx.com",
"primary":true
},
"noContact":"email"
}
}
下面是JSON支持的数据格式以及与之相关联的格式规则:
- 数字:无双引号
- bool类型:true或false,无双引号
- 字符串:必须用双引号括起
- 数组:方括号包围的以逗号分隔的列表
- 对象:花括号包围的键值对集合
- null:无双引号
通常,服务器返回到客户端的数据为JSON或者XML格式,但是,对于iOS应用而言,JSON是最佳的数据交换格式。它比XML能更好地映射到Foundation类型。
JSON-OC转换对照:
二、解析与封装JSON数据
这里只介绍苹果原生的API:NSJSONSerialization
1、解析JSON
NSJSONSerialization提供了两个方法来解析JSON数据:
—JSONObjectWithData:options:error: 根据传递进来的JSON数据创建Foundation对象;
—JSONObjectWithStream:options:error: 行为与上一个方法类似,不过接收的数据源是输入流。
代码示例:
-(void)testJSON{
// 1. 创建URL
NSURL *url = [NSURL URLWithString:@"..."];
// 2. 创建请求对象
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
req.timeoutInterval = 10.0; // 设置请求超时
req.HTTPMethod = @"POST"; // 设置请求方法
// 3. 设置请求体
NSString *param = [NSString stringWithFormat:@"......"];
req.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; // 把拼接后的字符串转换为data并设置HTTPBody
// 4. 发送请求
NSOperationQueue *queue = [NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:req queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (data) {
// 请求成功
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
}else{
// 请求失败
NSLog(@"请求失败");
}
}];
}
2、封装JSON
NSJSONSerialization提供了两个JSON数据的创建方法
—dataWithJSONObject:options:error:
—writeJSONObject:toStream:options:error:
它还提供了isValidJSONObject:来验证对象是否可以转换为JSON。满足一下条件的对象才能转换成JSON对象:
- 根对象是NSArray或NSDictionary;
- 所有对象必须是NSString、NSNumber、NSArray、NSDictionary或NSNull;
- 所有的NSDictionary的key必须是NSString;
- NSNumber不能为NaN或无穷大。
代码示例:
// 请求的流程与上面的代码类似,这里只写出封装JSON对象的代码
NSData *payload = [NSJSONSerialization dataWithJSONObject:myData options:NSJSONWritingPrettyPrinted error:nil];