• 多线程与网络之JSON和XML数据的解析


    JSON 和 OC之间的互转

    • 0.简介

      1.什么是JSON
      
      1) JSON是一种轻量级的数据格式,一般用于数据交互
      2) 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
      
      2.相关说明
      
      1) JSON的格式很像OC中的字典和数组
      2) 标准JSON格式key必须是双引号
      
      3.JSON解析方案
      
      1)第三方框架 JSONKit/SBJSON/TouchJSON
      2)苹果原生 NSJSONSerialization(常用)
    • 1.Json --> OC(反序列化)

      /*
           第一个参数:要解析的二进制数据(json)
           第二个参数:
              NSJSONReadingMutableContainers = (1UL << 0), 表示时一个可变的数组或者是字典
              NSJSONReadingMutableLeaves = (1UL << 1),     字符串也是可变 iOS7有问题
              NSJSONReadingAllowFragments = (1UL << 2)     既不是数组也不是字典,必须使用该枚举值
           第三个参数:错误信息
           */
          NSError *error = nil;
          NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
    • 2.OC --> Json(序列化)

      /*
       注意:可以通过+ (BOOL)isValidJSONObject:(id)obj;方法判断当前OC对象能否转换为JSON数据
       具体限制:
           1.obj 是NSArray 或 NSDictionay 以及他们派生出来的子类
           2.obj 包含的所有对象是NSString,NSNumber,NSArray,NSDictionary 或NSNull
           3.字典中所有的key必须是NSString类型的
           4.NSNumber的对象不能是NaN或无穷大
       */
      /*
       第一个参数:要转换成JSON数据的OC对象,这里为一个字典
       第二个参数:NSJSONWritingPrettyPrinted对转换之后的JSON对象进行排版,无意义
       */
      if ([NSJSONSerialization isValidJSONObject:array]) {
          NSError *error = nil;
          NSData *data = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:&error];
          NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
      }else {
          NSLog(@"不能转换");
      }
    • 3.查看JSON数据

      方法一:
      把解析后的数据写plist文件,通过plist文件可以直观的查看JSON的层次结构。
      [dictM writeToFile:@"/Users/LongLJ/Desktop/xiao.plist" atomically:YES];
      方法二:
      在线格式化http://tool.oschina.net/codeformat/json
    • 4.视频的简单播放

      //0.需要导入系统框架
      #import <MediaPlayer/MediaPlayer.h>
      
      //1.拿到该cell对应的数据字典
      LJVideo *video = self.videos[indexPath.row];
      NSString *videoStr = [@"http://120.25.226.186:32812" stringByAppendingPathComponent:video.url];
      
      //2.创建一个视频播放器
      MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL URLWithString:videoStr]];
      
      //3.present播放控制器
      [self presentViewController:vc animated:YES completion:nil];

    XML解析

    • 0.简介

      • XML: 可扩展标记语言
      1.语法
      2.XML文档的三部分(声明/元素和属性)
      3.其它注意点(注意不能交叉包含/空行换行/XML文档只能有一个根元素等)
      • XML解析
      1. 解析的两种方式
          SAX:从根元素开始,按顺序一个元素一个元素的往下解析,可用于解析大/小文件
          DOM:一次性将整个XML文档加载到内存中,适合较小的文件
      2. 解析XML的工具
          苹果原生NSXMLParser:使用SAX方式解析,简单
          第三方框架:libxml2:纯c语言,默认在ios中,同时支持DOM和SAX方式解析
                      GDataXML:使用DOM方式解析,由Goole开发,基于xml2
    • 1.XML解析(NSXMLParser) --- 利用代理方法

      // 解析步骤
      // 1.创建一个解析器
      NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
      // 2.设置代理
      parser.delegate = self;
      // 3.开始解析
      [parser parse];
      
      // 代理方法
      // 1.当开始解析XML文件的时候调用
      - (void)parserDidStartDocument:(NSXMLParser *)parser
      {
      }
      // 2.开始解析某个元素的时候调用,调用多次
      - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
          qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
      {
      NSLog(@"didStartElement:%@--%@",elementName,attributeDict);
      [self.videoItems addObject:[LJVideoItem mj_objectWithKeyValues:attributeDict]];
      }
      // 3.结束解析某个元素的时候调用 调用多次
      - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
          qualifiedName:(NSString *)qName
      {
      }
      // 4.当结束解析XML文件的时候调用
      - (void)parserDidEndDocument:(NSXMLParser *)parser
      {
      }

    多值参数和中文输出

    • 1.多值参数
      • 必须参数=值&参数=值来写
    • 2.中文输出
      • 2.1 新建分类(字典或者数组的分类)
      • 2.2 重写- (NSString *)descriptionWithLocale:(id) locale方法
      • 2.3 在上面方法中拼接元素格式化输出
  • 相关阅读:
    LUA之面向对象
    LUA笔记之表
    LUA笔记之字符串
    STM32模拟I2C
    php(1)-php5.6启动命令
    ip地址变更对tomcat和nginx的影响
    解决 nginx: [alert] kill(189, 1) failed (3: No such process)
    linux(16)-yum安装提示“没有可用软件包”
    性能测试监控分析(17) 负载和CPU使用率低高负载的原因
    Codeforces Round #588 (Div. 2)C(思维,暴力)
  • 原文地址:https://www.cnblogs.com/LongLJ/p/5084340.html
Copyright © 2020-2023  润新知