美文网首页iOS DeveloperiOS学习
网络编程—数据解析(JSON)

网络编程—数据解析(JSON)

作者: 小白文_Vincent | 来源:发表于2016-12-21 15:59 被阅读0次
    文艺求关注.png
    • <h5>JSON</h5>
      • 什么是JSON
        • JSON是一种轻量级的数据格式,一般用于数据交互
        • 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
      • JSON的格式很像OC中的字典和数组
        {"name" : "Vincent", "age" : 10}
        {"names" : ["Vincent", "Eli", "Ives"]}
      • 标准JSON格式的注意点:key必须用双引号
      • 要想从JSON中挖掘出具体数据,得对JSON进行解析
        -JSON转换为OC数据类型

    <h5>JSON–OC转换对照表</h5>

    JSON OC
    大括号{ } NSDictionary
    中括号[ ] NSArray
    双引号" " NSString
    数字10、10.8 NSNumber
    • <h5>JSON解析方案</h5>
      • 在iOS中,JSON的常见解析方案有四种
        • 第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
        • 苹果原生,序列化工具(自带):NSJSONSerialization(性能最好
      • NSJSONSerialization的常见方法
        • JSON数据 --> OC对象(反序列化)
          +(id)JSONObjectWithData:(NSData)data options:(NSJSONReadingOptions)opterror:(NSError*)error;
        • OC对象 --> JSON数据(序列化)
          +(NSData)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError*)error;

    <b>序列化/反序列化在代码中的应用</b>

    • 反序列化
    - (void)deserialization {   // JSON --> OC对象(反系列化)
    
        // 01.确定请求路径
        NSURL *url = [NSURL URLWithString:@""];
        
        // 02.创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        // 03.发送异步请求
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    
            //data --> 本质上是一个json字符串
            // 04.解析数据
            /**
             JSON --> OC对象  反序列化
             
             @param NSData JSON的二进制数据
             @param NSJSONReadingOptions 位移枚举
             @param NSError 错误信息
             @return NSDictionary
             */
            /**
             NSJSONReadingMutableContainers = (1UL << 0),   // 可变字典或数组
             NSJSONReadingMutableLeaves = (1UL << 1),       // 内部所有的字符串都是可变的,注意iOS7之后有问题,一般不用
             NSJSONReadingAllowFragments = (1UL << 2)       // 既不是字典也不是数组,则必须使用该枚举值(一般用此枚举值)
             */
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            NSLog(@"%@", dic[@"error"]);
    
            //枚举值:NSJSONReadingAllowFragments使用
            NSString *strM = @"\"By_Vincent\"";
            id obj = [NSJSONSerialization JSONObjectWithData:strM options:NSJSONReadingAllowFragments error:nil];
            NSLog(@"%@------%@---", [obj class], obj);
        }];
    }
    
    • 序列化
    - (void)serialization { //OC对象 --> JSON对象(序列化)
    
        NSDictionary *dictM = @{
                               @"name":@"Vincent",
                               @"age":@"24"
                               };
        NSArray *arrayM = @[@"123", @"456"];
    
        //注意:并不是所有的OC对象都能转换成JSON对象的
        /**
         - Top level object is an NSArray or NSDictionary   //最外层必须是字典或者是数组
         - All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull //所有的元素必须是字符串,数字,数组,字典或者NSNull类型
         - All dictionary keys are NSStrings    //所有字典中的key必须是字符串类型
         - NSNumbers are not NaN or infinity    //数字类型必须是正确的数字,不能是无穷大
         */
        BOOL isValid = [NSJSONSerialization isValidJSONObject:dictM];
        if (!isValid) {
            NSLog(@"%zd", isValid);
            return;
        }
    
        /**
         // OC --> JSON
         @param id 要转化的OC对象
         @param NSJSONWritingOptions 选项:NSJSONWritingPrettyPrinted,自动排版 美观
         @param NSError 错误信息
         @return NSData
         */
        NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];
        
        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }
    
    关注一下又不会怀孕.png

    相关文章

      网友评论

        本文标题:网络编程—数据解析(JSON)

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