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数据是非常常见的需求:
- 在线格式化工具
- 将服务器返回的字典或数组写成
plist
文件进行查看。
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使用步骤:
-
传入XML数据,创建解析器:
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
-
设置代理,监听解析过程:
parser.delegate = self;
-
开始解析:
[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标记。
具体用法:
-
加载整个文档:
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
-
获取根节点:
GDataXMLElement *root = doc.rootElement;
-
获取其他节点:
[root elementsForName:@"video"];
-
获取节点属性:
[[element attributeForName:@"name"] stringValue];
6. JSON和XML的比较
同一份数据既可以用JSON表示,也可以用XML表示。两者的对比如下:
- JSON:体积小,解析速度快,数据结构简单,适合移动端应用。
- XML:支持复杂的数据结构和更多的功能,但相对体积较大。
在移动端,服务器返回的数据更趋向于使用JSON格式,因为体积较小,更加高效。
结论
掌握JSON和XML的解析方法在iOS开发中是非常重要的技能。通过合理的选择和使用解析工具,可以高效地处理网络数据,提升应用性能和用户体验。