iOS开发基础41-网络编程之JSON和XML

在现代移动应用开发中,网络编程是一项必不可少的技能。移动应用通常需要与服务器进行数据交互,以提供实时更新的数据服务。无论是社交网络、新闻阅读、视频播放还是地图导航,网络通信的处理几乎无处不在。本篇文章将详细介绍如何在iOS开发中使用JSON和XML进行数据解析。

一、JSON概述

1. JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它易于人阅读和编写,也易于机器解析和生成。服务器返回给客户端的数据通常是JSON格式或XML格式(不包含文件下载)。

JSON的格式类似于OC中的字典和数组。例如:

{
  "name": "jack",
  "age": 10
}
{
  "names": ["jack", "rose", "jim"]
}

注意:标准的JSON格式要求键名必须用双引号括起来。

2. JSON和Objective-C对象的转换

在iOS中,我们可以将JSON数据解析成Objective-C对象进行操作。它们之间的对应关系如下:

  • {} -> NSDictionary (@{})
  • [] -> NSArray (@[])
  • "jack" -> NSString (@"jack")
  • 10 -> NSNumber (@10)
  • 10.5 -> NSNumber (@10.5)
  • true -> NSNumber (@1)
  • false -> NSNumber (@0)
  • null -> NSNull

3. JSON解析方案

iOS支持多种JSON解析方案:

  • 第三方框架

    • JSONKit
    • SBJson
    • TouchJSON (性能从好到差)
  • 苹果原生框架

    • NSJSONSerialization(性能最好)

4. 使用NSJSONSerialization

JSON数据 -> OC对象

NSJSONSerialization类提供了方法将JSON数据转换为OC对象:

+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
  • NSJSONReadingOptions的值:
    • NSJSONReadingMutableContainers:创建出的数组和字典都是可变的。
    • NSJSONReadingMutableLeaves:数组或字典里的字符串是可变的(iOS7后无效)。
    • NSJSONReadingAllowFragments:允许解析出的对象不是数组或字典,比如字符串或NSNumber。

示例用法:

NSURL *url = [NSURL URLWithString:@"http://example.com/login?username=520it&pwd=520it&type=JSON"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    if (data) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"%@", dict);
    }
}];

OC对象 -> JSON数据

转换OC对象为JSON数据可以使用以下方法:

+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

示例用法:

NSDictionary *dict = @{
    @"name": @"lnj",
    @"age": @10,
    @"gender": @"man"
};

NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonString);

5. JSON数据格式化与调试

在企业开发中,查看和调试JSON数据是非常常见的需求:

6. 字典转模型相关框架

常用的字典转模型框架包括:

  • Mantle:所有模型必须继承自MTModel
  • JSONModel:所有模型必须继承自JSONModel
  • MJExtension:无需继承任何类,使用简单,推荐使用。

示例用法:

[CHGVideo setupReplacedKeyFromPropertyName:^NSDictionary *{
    return @{@"ID": @"id"};
}];

self.videos = [CHGVideo objectArrayWithKeyValuesArray:dict[@"videos"]];

二、XML概述

1. XML简介

XML(Extensible Markup Language)是一种用于数据交互的常用格式,也称为XML文档(XML Document)。和JSON类似,XML也用于在服务器和客户端之间交换数据。

示例XML:

<videos>
    <video name="小黄人 第01部" length="30" />
    <video name="小黄人 第02部" length="19" />
    <video name="小黄人 第03部" length="33" />
</videos>

2. XML语法

一个标准的XML文档包括以下部分:

  • 文档声明:位于XML文档的最前面,声明XML文档的类型,例如:

    <?xml version="1.0" ?>
    
  • 元素(Element):包括开始标签和结束标签。

    • 有内容的元素:<video>小黄人</video>
    • 无内容的元素:<video/>
  • 属性(Attribute):元素可以拥有多个属性,例如:

    <video name="小黄人 第01部" length="30" />
    

注意:XML中的空格和换行符会被视为内容。

3. XML解析

XML解析方式主要有两种:

  • DOM:一次性将整个XML文档加载进内存,适合解析小文件。
  • SAX:按顺序一个元素一个元素解析,适合解析大文件。

iOS中的XML解析工具:

  • 苹果原生

    • NSXMLParser:基于SAX方式解析,使用简单。
  • 第三方框架

    • libxml2:包含在iOS SDK中,支持DOM和SAX解析。
    • GDataXML:基于libxml2的DOM解析框架,由Google开发。

4. 使用NSXMLParser解析XML

NSXMLParser使用步骤:

  1. 传入XML数据,创建解析器:

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    
  2. 设置代理,监听解析过程:

    parser.delegate = self;
    
  3. 开始解析:

    [parser parse];
    

NSXMLParserDelegate代理方法:

  • 当扫描到文档的开始时调用:

    - (void)parserDidStartDocument:(NSXMLParser *)parser;
    
  • 当扫描到文档的结束时调用:

    - (void)parserDidEndDocument:(NSXMLParser *)parser;
    
  • 当扫描到元素的开始时调用(attributeDict保存元素的属性):

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
    
  • 当扫描到元素的结束时调用:

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
    

5. 使用GDataXML解析XML

使用前配置

使用GDataXML解析XML需要进行一些配置,包括添加库文件和设置非ARC标记。

具体用法:

  1. 加载整个文档:

    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    
  2. 获取根节点:

    GDataXMLElement *root = doc.rootElement;
    
  3. 获取其他节点:

    [root elementsForName:@"video"];
    
  4. 获取节点属性:

    [[element attributeForName:@"name"] stringValue];
    

6. JSON和XML的比较

同一份数据既可以用JSON表示,也可以用XML表示。两者的对比如下:

  • JSON:体积小,解析速度快,数据结构简单,适合移动端应用。
  • XML:支持复杂的数据结构和更多的功能,但相对体积较大。

在移动端,服务器返回的数据更趋向于使用JSON格式,因为体积较小,更加高效。

结论

掌握JSON和XML的解析方法在iOS开发中是非常重要的技能。通过合理的选择和使用解析工具,可以高效地处理网络数据,提升应用性能和用户体验。

posted @ 2015-08-22 20:30  Mr.陳  阅读(1130)  评论(0编辑  收藏  举报