- JSON – OC 转换对照表:
|
JSON |
OC |
|
大括号 { } |
NSDictionary |
|
中括号 [ ] |
NSArray |
|
双引号 " " |
NSString |
|
数字 10、10.8 |
NSNumber |
- JSON解析方案
在iOS中,JSON的常见解析方案有4种
第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
苹果原生(自带):NSJSONSerialization(性能最好)
NSJSONSerialization的常见方法
JSON数据> OC对象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
OC对象> JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
- JSON解析相关代码
(1)json数据->OC对象
1 -(void)jsonToOC 2 { 3 //1. 确定url路径 4 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=33&pwd=33&type=JSON"]; 5 6 //2.创建一个请求对象 7 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 8 9 //3.使用NSURLSession发送一个异步请求 10 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 11 12 //4.当接收到服务器响应的数据后,解析数据(JSON--->OC) 13 14 /* 15 第一个参数:要解析的JSON数据,是NSData类型也就是二进制数据 16 第二个参数: 解析JSON的可选配置参数 17 NSJSONReadingMutableContainers 解析出来的字典和数组是可变的 18 NSJSONReadingMutableLeaves 解析出来的对象中的字符串是可变的 iOS7以后有问题 19 NSJSONReadingAllowFragments 被解析的JSON数据如果既不是字典也不是数组, 那么就必须使用这个 20 */ 21 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 22 NSLog(@"%@",dict); 23 24 }]; 25 }
(2)OC对象->JSON对象
1 //1.要转换成JSON数据的OC对象*这里是一个字典 2 NSDictionary *dictM = @{ 3 @"name":@"wendingding", 4 @"age":@100, 5 @"height":@1.72 6 }; 7 //2.OC->JSON 8 /* 9 注意:可以通过+ (BOOL)isValidJSONObject:(id)obj;方法判断当前OC对象能否转换为JSON数据 10 具体限制: 11 1.obj 是NSArray 或 NSDictionay 以及他们派生出来的子类 12 2.obj 包含的所有对象是NSString,NSNumber,NSArray,NSDictionary 或NSNull 13 3.字典中所有的key必须是NSString类型的 14 4.NSNumber的对象不能是NaN或无穷大 15 */ 16 /* 17 第一个参数:要转换成JSON数据的OC对象,这里为一个字典 18 第二个参数:NSJSONWritingPrettyPrinted对转换之后的JSON对象进行排版,无意义 19 */ 20 NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil]; 21 22 //3.打印查看Data是否有值 23 /* 24 第一个参数:要转换为STring的二进制数据 25 第二个参数:编码方式,通常采用NSUTF8StringEncoding 26 */ 27 NSString *strM = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 28 NSLog(@"%@",strM);
(3)OC对象和JSON数据格式之间的一一对应关系
1 //OC对象和JSON数据之间的一一对应关系 2 -(void)oCWithJSON 3 { 4 //JSON的各种数据格式 5 //NSString *test = @"\"wendingding\""; 6 //NSString *test = @"true"; 7 NSString *test = @"{\"name\":\"wendingding\"}"; 8 9 //把JSON数据->OC对象,以便查看他们之间的一一对应关系 10 //注意点:如何被解析的JSON数据如果既不是字典也不是数组(比如是NSString), 那么就必须使用这NSJSONReadingAllowFragments 11 id obj = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil]; 12 13 NSLog(@"%@", [obj class]); 14 15 16 /* JSON数据格式和OC对象的一一对应关系 17 {} -> 字典 18 [] -> 数组 19 "" -> 字符串 20 10/10.1 -> NSNumber 21 true/false -> NSNumber 22 null -> NSNull 23 */ 24 } 25 }
(4)如何查看复杂的JSON数据
方法一: 在线格式化http://tool.oschina.net/codeformat/json 方法二: 把解析后的数据写plist文件,通过plist文件可以直观的查看JSON的层次结构。 [dictM writeToFile:@"/Users/文顶顶/Desktop/videos.plist" atomically:YES];
(5)视频的简单播放
1 //0.需要导入系统框架 2 #import <MediaPlayer/MediaPlayer.h> 3 4 //1.拿到该cell对应的数据字典 5 XMGVideo *video = self.videos[indexPath.row]; 6 7 NSString *videoStr = [@"http://120.25.226.186:32812" stringByAppendingPathComponent:video.url]; 8 9 //2.创建一个视频播放器 10 MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL URLWithString:videoStr]]; 11 //3.present播放控制器 12 13 [self presentViewController:vc animated:YES completion:nil];
浙公网安备 33010602011771号