JSON和XML

作者: Coder007 | 来源:发表于2017-02-15 18:18 被阅读24次

    数据解析

    • 在日常开发中,我们需要和服务端交互,传输数据的过程中就需要对服务端传输的数据进行解析
    • 我们日常开发中最常用的就是json格式的数据,当然也有少部分是用xml的
    • json格式的解析这里只提示系统提供的方法,至于第三方框架,这里不做介绍

    json格式

    • {} -> NSDictionary @{}
    • [] -> NSArray @[]
    • "" -> NSString @""
    • 10 -> NSNumber @10
    • 10.5 -> NSNumber @10.5
    • true -> NSNumber @1
    • false -> NSNumber @0
    • null -> NSNull
    /**
     NSJSONReadingMutableContainers //  创建出来的数组和字典就是可变
     NSJSONReadingMutableLeaves  // 数组或者字典里面的字符串是可变的
     NSJSONReadingAllowFragments // 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber
     */
     // 前面用什么容器接收,options使用那个枚举,这些都需要根据实际情况选择
     // 如果不用关心容器是否可变,那么可以使用kNilOptions
    [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    
    // OC对象转换成JSON对象
    // obj是OC对象
    [NSJSONSerialization dataWithJSONObject:obj options:NSJSONWritingPrettyPrinted error:nil];
    

    XML解析

    • XML解析有两种方法
      • 苹果原生
        • NSXMLParser:SAX方式解析,使用简单,适合大文件解析
      • 第三方框架
        • libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析
        • GDataXML:DOM方式解析,基于libxml2,适合小文件解析
    NSXMLParser
    // 传入XML数据,创建解析器
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 设置代理,监听解析过程
    parser.delegate = self;
    // 开始解析
    [parser parse];
    
    // 当扫描到文档的开始时调用(开始解析)
    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
    }
    
    // 开始解析节点“元素”
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
    {
    }
    // 发现节点文本字符
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
    }
    
    // 结束节点
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
    }
    
    // 当扫描到文档的结束时调用(解析完毕)
    - (void)parserDidEndDocument:(NSXMLParser *)parser
    {
    }
    
    // 解析错误
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
    {
    }
    
    GDataXML
    • 导入libxml2
    • Header Search Paths加入/usr/include/libxml2
    • Other Linker Flags中加入-lxml2
    • Build Phases -> omplie Sources中将GDataXMLNode.m 添加 -fno-objc-arc
    // 加载整个文档
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    
    // 获得所有video元素
    NSArray *elements = [doc.rootElement elementsForName:@"video"];
    for (GDataXMLElement *ele in elements) {
        YWVideo *video = [[YWVideo alloc] init];
        video.name = [ele attributeForName:@"name"].stringValue;
         // 类似的取出其他数据
         
        // 添加到数组
        [self.videos addObject:video];
    }
    

    相关文章

      网友评论

        本文标题:JSON和XML

        本文链接:https://www.haomeiwen.com/subject/sagqwttx.html