JSON

作者: 952625a28d0d | 来源:发表于2017-02-08 23:17 被阅读38次

    NSURL请求解析

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        // 获取JSON数据
        // 在实际开发中几乎用不到
    //    NSData *data = [NSData dataWithContentsOfURL:@""];
        /**
         - 因为默认时长是60S 没有办法修改 而且没有缓存策略
         - dataWithContentOfURL 是同步方法
         - 没有错误处理机制
         */
        
        // 使用网络来获取数据
        NSURL *url = [NSURL URLWithString:@""];
    //    NSURLRequest *request = [NSURLRequest requestWithURL:url];
        // 使用缓存策略
        /**
         * timeoutInterval 超时时长 默认的是60秒 一般在实际开发的过程中建议:15-30秒 太短了可能服务器来不及做出响应 太长了用户等待太久了 也影响用户体验
         - SDWebImage 默认时长 15S 
         - AFNetworking 默认时长 60S
         * cachePolicy 缓存策略
         四种缓存策略
         typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
         {
         
         // 默认缓存策略
         NSURLRequestUseProtocolCachePolicy = 0,
         
         // 忽略本地服务器的缓存数据 直接加载网络数据 也就是每次都请求 每次都是最新数据
         应用场景为:数据变化非常频繁的App 比方说股票 彩票等
         NSURLRequestReloadIgnoringLocalCacheData = 1,
         
         *** 以下两个选项,专门用户离线浏览的 建议结合 Reachability 框架联合使用
         - 如果用户当前没有网络 我们就是用本地缓存策略 
         - 如果有网络 就是用默认缓存策略
         
         NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
         NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
         
         NSURLRequestReturnCacheDataElseLoad = 2, // 返回缓存数据 如果没有缓存 从服务器加载
         NSURLRequestReturnCacheDataDontLoad = 3, // 返回缓存数据 如果没有缓存 则空着
         
         NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
         };
    
         */
        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15.0];
        // 异步发送 带有错误处理机制!
        /**
         * request 请求
         * queue 调度任务的队列
         指定调度回调代码块的队列 决定了回调的代码块执行队列
         - 主队列回调的代码块在主线程上执行
         - 新建队列 就会在其他线程执行回调代码
         如何选择?判断是否需要更新UI
         如果我们网络获取到数据之后需要立马刷新UI则使用主队列
         * 3.block 回调代码块 在网络请求结束后执行的
         3.1 response 服务器的响应
             response(NSHTTPURLRequest)
              URL 服务器返回的URL 绝大部分和请求的URL是一样的 有的时候不一样 “重定向(根据电脑硬件处理)”
              MIMEType 二进制数据的文件类型 服务器会告诉客户端 可以使用什么软件打开二进制数据
              expectedContentLength 下载文件的长度
              textEncodingName  文本编码名称 大多是UTF8
              suggestedFilename 服务器建议保存的文件名称
              statusCode        状态吗 2XX 3XX 重定向 4XX客户端错误 5XX服务器错误
              allHeaderFields   所有响应头内容
         3.2 data 数据实体 程序员开发最关心的
         3.3 error 错误处理
            注意:有一种情况是没有错误,也没有数据!!
             if (connestionError || data == nil){
                 NSLog(@"你的网络不给力 请稍后再试!");
             }
         */
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
            NSLog(@"%@",response);
            NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",json);
        }];
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    @end
    

    JSON解析详解

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        NSURL *url = [NSURL URLWithString:@""];
        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15.0];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
            // 解析数据
            // 二进制数据-->OC对象 : 反序列化
            // 装着字典的数组
            // NSJSONSerialization JSONObjectWithData 能够将网络返回的二进制数据转换为字典或者数组
            // JSON本质上就是一个特殊格式的字符串
            // JSON出自于民间 后来被广泛使用
            /**
             顶级节点必须是NSArray 或者是NSDictionary
             所有的对象必须是 NSString NSArray NSNumber NSDictionary NSNull
             所有的字典的Key必须是NSString
             所有的NSNumbers不能使无理数或者空
             */
            
            /**
            typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
             
             // 容器节点是可变的
                NSJSONReadingMutableContainers = (1UL << 0),
             // 子节点是可变的
                NSJSONReadingMutableLeaves = (1UL << 1),
             // 允许顶级节点不是NSArray 或者 NSDictionary
                NSJSONReadingAllowFragments = (1UL << 2)
            } NS_ENUM_AVAILABLE(10_7, 5_0);
             */
            
            id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            NSLog(@"%@ %@",result,[result class]);
    //        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    //        NSLog(@"%@",result);
        }];
    }
    
    
    //MARK : --关于枚举
    /**
     C语言定义枚举的类型,枚举的数据类型是不确定的,会默认的使用 int 
     从iOS 6.0之后推出两个宏 NS_ENUM NS_OPTIONS
     NS_ENUM 定义枚举的同时 可以指定数据的类型
     NS_OPTIONS 定义的枚举是位移的 可以用按位 或 设置数值
     一般看到 NS_OPTIONS 定义的枚举 直接传入0 作为参数 表示什么附加操作也不做 效率最高!
     */
    
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    @end
    

    相关文章

      网友评论

          本文标题:JSON

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