多线程与网络之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 在上面方法中拼接元素格式化输出
posted @ 2015-12-28 23:05  LongLJ  阅读(429)  评论(0编辑  收藏  举报