• iOS网络-02-数据解析(JSON与XML)


    数据交互格式


    • 服务器返回给用户的数据,通常是以下两种方式:
      • JSON
      • XML
    • JSON
      • 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式
      • 用使用JSON文件中的数据,需要对其进行解析,苹果的NSJSONSerialization解析性能最好
      • iOS中的JSON文件解析,是将其转换成OC对象,如下:
        • 大括号{} --> 字典NSDictionary
        • 中括号[] --> 数组NSArray
        • 双引号"" --> 字符串NSString
        • 数字 --> NSNumber
      • JSON通常使用NSJSONSerialization进行解析,性能最好
    • XML
      • XML(Extension Markup Language),可扩展标记语言
      • 是服务器返回客户端常用的一种数据格式
      • XML文档,通常包含以下内容
        • 文档声明
        • 元素(element)
        • 属性(attribute)
      • XML文档的解析方案
        • 小文件:NSXMLParser苹,果原生
        • 大文件:GDataXML,Google开发,基于libxml2

    JSON解析


    • 解析类型

      • 默认解析NSDictionary与NSArray类型的数据
      • 若要解析NSString类型的数据,需要使用NSJSONReadingAllowFragments参数
    • 一个对象通常要遵循以下规则才能转换成JSON文档

      • 根节点是NSDictionary或NSArray类型
      • 所有的对象必须是NSString、NSNumber、NSArray、NSDictionary或NSNull中的一种
      • 对象个数有限
    • JSON数据与OC对象的转化

      • JSON --> OC
      + (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error
      /**
      * data:需要解析的NSData类型数据
      * opt:解析方式
      * error:错误信息
      */
      
      • OC --> Json
      + (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error
      /**
      * obj:需要转换的OC对象
      * opt:解析方式
      * error:错误信息
      */
      
    • 解析NSString

      NSString *json = "I am a coder";
      [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil]
      /**
      * JSON解析的数据通常是使用NSUTF8StringEncoding编码的NSData类型数据
      * options:指定可以解析的类型,NSJSONReadingAllowFragments表示可以解析	NSString对象
      * error:返回解析错误信息
      * 返回值为解析完成的NSString对象
      */
      
    • 解析NSDictionary与NSArray(来自服务器的数据)

      /**Block的方式发送请求*/
      //创建请求对象
      NSURLRequest *request = [NSURLRequest requestWithURL:(此处为请求路径)];
      //发送请求
      [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
          NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
      }];
      /**
      * queue:请求任务所在的队列
      * completionHandler:请求完成回调的Block
      	* response:服务器的响应信息
      	* data:服务器返回的数据
      	* error:错误信息
      	* 将data解析成对应的NSDictionary对象
      */
      

    XML解析


    • 小文件解析(NSXMLParser)

      • 通过NSXMLParser解析XML文档,需要用到代理协议NSXMLParserDelegate
      • NSXMLParserDelegate协议的常用方法
      // 1. 开始解析XML文档的时候调用
      - (void)parserDidStartDocument:(NSXMLParser *)parser
      // 2. 解析到XML文档中某个元素的开始的时候调用,解析任务的核心
      - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict
      /**
      * elementName:正在解析的元素的名字
      * attributeDict:解析生成的OC对象
      */
      // 3. 解析到XML文档中某个元素的结束的时候调用
      - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
      // 4. 解析到XML文档结尾的时候调用
      - (void)parserDidEndDocument:(NSXMLParser *)parser
      
      • 解析步骤
      // 1. 创建解析器 
      NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
      // 2. 设置代理
      parser.delegate = self;
      // 3. 启动解析器
      [parser parse];
      // 4. 在代理方法中完成具体的解析任务
      
    • 大文件解析(GDataXML)

      • 与GDataXML相关的几个类
        • GDataXMLDocument,整个XML文档
        • GDataXMLElement,XML文档中的一个元素
      • 解析步骤
      // 1. 将XML文档数据,转换成GDataXMLDocument类型的对象
      GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
      // 2. 获取GDataXMLDocument对象中根节点的所有元素
      NSArray *elements = [document.rootElement elementsForName:@"此处为元素的名字"];
      /**
      * 获取XML文档中指定名字的所有元素
      */
      // 3. 解析每个元素中的数据
      for (GDataXMLElement *ele in elements)
      {
      	[ele attributeForName:@"此处为元素中的Key"].stringValue;
      	/**
      	* 解析元素ele中键值为Key的属性值,将其转化为字符串对象
      	*/
      }
      
  • 相关阅读:
    iOS9 News 应用
    swift中,Optional、?与!之间的关系
    [翻译] CotEditor
    [book] iOS 8 Swift Programming Cookbook
    便利的操作plist文件
    消除 Xcode7 中 directory not found for option 'xxxx' 警告
    点击单个cell高度变化的动画效果
    [翻译] LiquidFloatingActionButton
    一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务
    一脸懵逼学习基于CentOs的Hadoop集群安装与配置(三台机器跑集群)
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/4741895.html
Copyright © 2020-2023  润新知