-
什么是JSON
- JSON是一种轻量级的数据格式,一般用于数据交互
- 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
JSON的格式很像OC中的字典和数组
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}标准JSON格式的注意点:key必须用双引号
要想从JSON中挖掘出具体数据,得对JSON进行解析
JSON 转换为 OC数据类型
要想从JSON中挖掘出具体数据,得对JSON进行解析
JSON 转换为 OC数据类型
在iOS中,JSON的常见解析方案有4种
第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
苹果原生(自带):NSJSONSerialization(性能最好)
NSJSONSerialization的常见方法
JSON数据(NSData) ->OC对象(Object)
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
- (void)parseJSON
{
// 0.请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520000&pwd=520it"];
// 1.创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2.发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
/*
NSJSONReadingMutableContainers
NSJSONReadingMutableLeaves
NSJSONReadingAllowFragments
不在乎返回的是什么东西,就用kNilOptions,效率最好
*/
// 解析JSON
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@", dict[@"error"]);
}];
}
OC对象 ->JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
NSData * data1 = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
NSString * str = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];
JSON数据解析出来,有时不方便阅读,可以使用JSON格式化工具排版(自行百度),或者转为plist文件。
[dict writeToFile:@"/Users/zhaoce/Desktop/video.plist" atomically:YES];
总结
JSON数据(NSData) -> OC对象(Foundation Object)
- {} -> NSDictionary @{}
- [] -> NSArray @[]
- "jack" -> NSString @"jack"
- 10 -> NSNumber @10
- 10.5 -> NSNumber @10.5
- true -> NSNumber @1
- false -> NSNumber @0
- null -> NSNull
JSON数据(NSData) -> OC对象(Foundation Object)
// 利用NSJSONSerialization类
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
- NSJSONReadingOptions
- NSJSONReadingMutableContainers = (1UL << 0)
- 创建出来的数组和字典就是可变
- NSJSONReadingMutableLeaves = (1UL << 1)
- 数组或者字典里面的字符串是可变的
- NSJSONReadingAllowFragments
- 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber
- NSJSONReadingMutableContainers = (1UL << 0)
OC对象(Foundation Object)-> JSON数据(NSData)
// 利用NSJSONSerialization类
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
格式化服务器返回的JSON数据
- 在线格式化:http://tool.oschina.net/codeformat/json
- 将服务器返回的字典或者数组写成plist文件
获取视频的字典数组
@property(nonatomic,strong)NSArray * videos;
//0.请求路径
NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/video"];
//1.创建请求对象
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//2.发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//解析JSON 序列化
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
//获取视频的字典数组
NSArray * dictArray = dict[@"videos"];
// 字典数组 —》 模型数组
NSMutableArray * videoArray = [NSMutableArray array];
for (NSDictionary * dict in dictArray) {
[videoArray addObject:[FWLVideo videoWithDict:dict]];
}
self.videos = videoArray;
//刷新表格
[self.tableView reloadData];
}];