json解析

作者: fwlong | 来源:发表于2016-06-24 20:30 被阅读280次
  • 什么是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.png
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

OC对象(Foundation Object)-> JSON数据(NSData)

// 利用NSJSONSerialization类
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

格式化服务器返回的JSON数据

获取视频的字典数组

@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];
        
    }];

相关文章

网友评论

    本文标题:json解析

    本文链接:https://www.haomeiwen.com/subject/tncodttx.html