iOS知识点整理-网络JSON/XML/解压缩

JSON

  • JSON是一种轻量级的数据格式,一般用于数据交互
  • 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)


    iOS知识点整理-网络JSON/XML/解压缩_第1张图片
    客户端获取数据

格式转换

  • JSON – OC 转换对照表
iOS知识点整理-网络JSON/XML/解压缩_第2张图片
JSON – OC 转换对照表
  • 示例
iOS知识点整理-网络JSON/XML/解压缩_第3张图片
示例

JSON解析方案

  • JSON的常见解析方案有4种
    • 第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
    • 苹果原生(自带):NSJSONSerialization(性能最好)

NSJSONSerialization

  • JSON数据 -> OC对象
// + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
    // 1.创建URL
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
    // 2.根据URL创建Request
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 3.利用NSURLConnection发送请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        /*
         Discription:将JSON格式的Data转为Oc
         第一个参数: 需要解析的JSON数据
         第二个参数: 解析JSON的可选配置参数
         NSJSONReadingMutableContainers 解析出来的字典和数组是可变的
         NSJSONReadingMutableLeaves 解析出来的对象中的字符串是可变的  iOS7以后有问题
         NSJSONReadingAllowFragments 被解析的JSON数据如果既不是字典也不是数组, 那么就必须使用这个
         */
        NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"%@",dic); // { success = "\U767b\U5f55\U6210\U529f"; }
    }];
  • OC对象 -> JSON数据
// + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
    /*
     第一个参数: 需要转换为JSON数据的OC对象
     第二个参数: 毫无意义
     NSJSONWritingPrettyPrinted : 对转换之后的JSON进行排版
     */
    NSDictionary *dict = @{
                           @"name" : @"dave",
                           @"age" : @20
                           };
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
    NSLog(@"%@",data); // 输出: <7b0a2020 226e616d 6522203a 20226461 7665222c 0a202022 61676522 203a2032 300a7d>

XML

  • 全称是Extensible Markup Language,译作“可扩展标记语言”
  • 跟JSON一样,也是常用的一种用于交互的数据格式
  • 一般也叫XML文档(XML Document)

结构

  • 一个常见的XML文档一般由以下部分组成
    • 文档声明,用来声明XML文档的类型
      • 最简单的声明

      • 用encoding属性说明文档的字符编码

    • 元素(Element)
      • 一个元素包括了开始标签和结束标签

        • 拥有内容的元素:
        • 没有内容的元素:
        • 没有内容的元素简写:
      • 一个元素可以嵌套若干个子元素(不能出现交叉嵌套)

      
          
      
      
        - 规范的XML文档最多只有1个根元素,其他元素都是根元素的子孙元素
        - XML中的所有空格和换行,都会当做具体内容处理,区分空格与换行
    - 属性(Attribute)
        - 一个元素可以拥有多个属性
            - `

XML解析

  • XML的解析方式有2种
    • DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
      • libxml2(纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析)
      • GDataXML(DOM方式解析,Google开发,基于libxml2
        )
      • NSXMLParser(苹果原生,使用简单)
    • SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
      • NSXMLParser
      • libxml2

DOM - 使用GDataXML

  • GDataXML基于libxml2库,得做以下配置

    • 导入libxml2库
    iOS知识点整理-网络JSON/XML/解压缩_第4张图片
    导入libxml2库
    • 设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件),在Head Search Path中加入/usr/include/libxml2
    iOS知识点整理-网络JSON/XML/解压缩_第5张图片
    设置libxml2的头文件搜索路径
    • 设置链接参数(自动链接libxml2库),在Other Linker Flags中加入-lxml2
    iOS知识点整理-网络JSON/XML/解压缩_第6张图片
    设置链接参数
    • 由于GDataXML是非ARC的,因此得设置编译参数
    iOS知识点整理-网络JSON/XML/解压缩_第7张图片
    设置编译参数
  • GDataXML中常用的类

    • GDataXMLDocument:代表整个XML文档
    • GDataXMLElement:代表文档中的每个元素
      • 使用attributeForName:方法可以获得属性值
  • 代码

***** + (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler *****
// XML - DOM方式
        // 1.加载所有的xml到内存中
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data
                                                               options:kNilOptions              error:nil];
        // 2.获取根元素
        GDataXMLElement *element = doc.rootElement;
        // 3.获取所有子元素
        NSArray *elements = [element elementsForName:@"video"];
        // 4.子元素转模型
        for (GDataXMLElement *element in elements) {
            ZJVideo *video = [[ZJVideo alloc] init];
            video.name = [element attributeForName:@"name"].stringValue;
            video.image = [element attributeForName:@"image"].stringValue;
            video.ID = [element attributeForName:@"id"].stringValue;
            video.length = [element attributeForName:@"length"].stringValue.intValue;
            video.url = [element attributeForName:@"url"].stringValue;
            [self.videos addObject:video];
        }
        [self.tableView reloadData];

SAX - 使用NSXMLParse

  • 代码
***** + (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler *****
    // 创建XML解析器
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 成为代理
    parser.delegate = self;
    // 开始解析
    [parser parse];

***** 代理方法 *****
/**
 *  开始解析文档
 */
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"%s",__func__);
}
/**
 *  开始解析XML文档中的每一个元素时调用
 *  解析顺序// videos-video、video
 */
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    // 解析的第一个元素videos,忽略
    if ([elementName isEqualToString:@"videos"]) {
        return;
    }
    ZJVideo *video = [ZJVideo objectWithKeyValues:attributeDict];
    [self.videos addObject:video];
}

/**
 *  解析完XML文档时调用
 */
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"%s",__func__);
    // 更新数据
    [self.tableView reloadData];
}
/**
 *  解析发生错误时调用
 */
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    NSLog(@"%s",__func__);
}

解压缩(ZipArchive框架)

  • 框架导入

    • 导入框架
    • 引入libz.dylib
    iOS知识点整理-网络JSON/XML/解压缩_第8张图片
    引入libz.dylib
    • 导入头文件Main.h
    iOS知识点整理-网络JSON/XML/解压缩_第9张图片
    导入头文件Main.h
  • 代码实现

    • 解压缩
    // 解压缩
    /*
     第一个参数: 需要解压缩的文件
     第二个参数: 解压缩之后放到什么地方
     */
    [Main unzipFileAtPath:@"/Users/apple/Desktop/xxx.zip" toDestination:@"/Users/apple/Desktop/xxx"];
    
    • 压缩
    /*
     打包一个文件, 压缩一个文件
     第一个参数: 压缩文件的存储位置
     第二个参数: 需要压缩的文件
     */
    // 需要压缩的文件数组
    NSArray *arr = @[
                     @"/Users/apple/Desktop/Snip20150810_13.png",
                     @"/Users/apple/Desktop/Snip20150810_14.png",
                     @"/Users/apple/Desktop/Snip20150810_15.png",
                     @"/Users/apple/Desktop/Snip20150810_16.png"
                     ];
    // 压缩
    [Main createZipFileAtPath:@"/Users/apple/Desktop/lnj.zip" withFilesAtPaths:arr];
     */
    /*
    // 直接压缩目标目录文件
    [Main createZipFileAtPath:@"/Users/apple/Desktop/lnj.zip" withContentsOfDirectory:@"/Users/apple/Desktop/abc"];
     */
    

你可能感兴趣的:(iOS知识点整理-网络JSON/XML/解压缩)