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

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

JSON–OC转换对照表

JSON OC
大括号{ } NSDictionary
中括号[ ] NSArray
双引号" " NSString
数字10、10.8 NSNumber
  • JSON解析方案
    • 在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;

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

  • 反序列化
- (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))