JSON数据
{"videos":[{"id":1,"image":"resources/images/minion_01.png","length":10,"name":"小黄人 第01部","url":"resources/videos/minion_01.mp4"},{"id":2,"image":"resources/images/minion_02.png","length":12,"name":"小黄人 第02部","url":"resources/videos/minion_02.mp4"},{"id":3,"image":"resources/images/minion_03.png","length":14,"name":"小黄人 第03部","url":"resources/videos/minion_03.mp4"},{"id":4,"image":"resources/images/minion_04.png","length":16,"name":"小黄人 第04部","url":"resources/videos/minion_04.mp4"},{"id":5,"image":"resources/images/minion_05.png","length":18,"name":"小黄人 第05部","url":"resources/videos/minion_05.mp4"},{"id":6,"image":"resources/images/minion_06.png","length":20,"name":"小黄人 第06部","url":"resources/videos/minion_06.mp4"},{"id":7,"image":"resources/images/minion_07.png","length":22,"name":"小黄人 第07部","url":"resources/videos/minion_07.mp4"},{"id":8,"image":"resources/images/minion_08.png","length":24,"name":"小黄人 第08部","url":"resources/videos/minion_08.mp4"},{"id":9,"image":"resources/images/minion_09.png","length":26,"name":"小黄人 第09部","url":"resources/videos/minion_09.mp4"},{"id":10,"image":"resources/images/minion_10.png","length":28,"name":"小黄人 第10部","url":"resources/videos/minion_10.mp4"},{"id":11,"image":"resources/images/minion_11.png","length":30,"name":"小黄人 第11部","url":"resources/videos/minion_11.mp4"},{"id":12,"image":"resources/images/minion_12.png","length":32,"name":"小黄人 第12部","url":"resources/videos/minion_12.mp4"},{"id":13,"image":"resources/images/minion_13.png","length":34,"name":"小黄人 第13部","url":"resources/videos/minion_13.mp4"},{"id":14,"image":"resources/images/minion_14.png","length":36,"name":"小黄人 第14部","url":"resources/videos/minion_14.mp4"},{"id":15,"image":"resources/images/minion_15.png","length":38,"name":"小黄人 第15部","url":"resources/videos/minion_15.mp4"},{"id":16,"image":"resources/images/minion_16.png","length":40,"name":"小黄人 第16部","url":"resources/videos/minion_16.mp4"}]}
JSON–OC 转换对照表
JSON | OC |
大括号 { } | NSDictionary |
中括号 [ ] | NSArray |
双引号 "" | NSString |
数字 10、10.8 | NSNumber |
在
iOS
中,
JSON
的常见解析方案有
4
种
第三方框架:
JSONKit
、
SBJson
、
TouchJSON
(性能从左到右,越差)
苹果原生(自带):
NSJSONSerialization
(
性能最好
)
1.苹果原生
NSJSONSerialization
的常见方法
JSON
数据 -->
OC
对象
+ (id)JSONObjectWithData:(NSData*)data options:(NSJSONReadingOptions)opterror:(NSError**)error;
// data 是获取到的json数据
- (NSArray *)parseJSONData:(NSData *)data
{
// 解析数据 (使用NSJSONSerialization 系统原生json解析类)
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSArray *array = dict[@"videos"];
NSMutableArray *videos = [NSMutableArray array];
for (NSDictionary *videoDict in array) {
HMVideo *video = [HMVideo videoWithDict:videoDict];
[videos addObject:video];
}
return videos;
}
OC
对象 -->
J
SON
数据
+ (NSData *)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError**)error;
XML(ExtensibleMarkupLanguage,译作“可扩展标记语言”)
<videos>
<video name="小黄人 第01部" length="30" />
<video name="小黄人 第02部" length="19" />
<video name="小黄人 第03部" length="33" />
</videos>
XML
的解析方式有
2
种
DOM
:一次性将整个
XML
文档加载进内存,比较适合解析
小
文件
SAX
:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析
大
文件
iOS
中,解析
XML
的手段有很多
苹果原生
NSXMLParser
:
SAX
方式解析
,
使用简单
第三方框架
libxml2
:纯
C
语言,默认包含在
iOS
SDK
中,同时支持
DOM
和
SAX
方式解析
GDataXML
:
DOM
方式解析,由
Google
开发
,
基于
libxml2
XML
解析方式的选择建议
大文件:
NSXMLParser
、
libxml2
p
小文件:
GDataXML
1.DOM (GDataXML 苹果自带)方式解析
一次性将整个XML文档加载进内存,比较适合解析小文件
GDataXML配置
GDataXML
基于
libxml2
库,得做以下配置
导入
libxml2
库
设置
libxml2
的头文件搜索路径(为了能找到
libxml2
库的所有头文件)
在
Head SearchPath
中加入
/
usr
/include/libxml2
设置链接参数(自动链接
libxml2
库)
在
Other
Linker
Flags
中加入
-lxml2
由于
GDataXML
是非
ARC
的,因此得设置编译参数
GDataXML使用
GDataXML
中常用的类
GDataXMLDocument
:
代表整个
XML
文档
GDataXMLElement
代表文档中的每个元素
使用
attributeForName
:
方法可以获得属性值
例如:
// data 是获取到的xml数据
- (NSArray *)DOMparseXMLWithData:(NSData *)data
{
// 1.加载文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 2.获得根元素
GDataXMLElement *root = doc.rootElement;
// 3.获得所有video元素
NSArray *elements = [root elementsForName:@"video"];
// 4.将GDataXMLElement对象转成HMVideo模型
NSMutableArray *videos = [NSMutableArray array];
for (GDataXMLElement *ele in elements) {
HMVideo *video = [[HMVideo alloc] init];
video.ID = [ele attributeForName:@"id"].stringValue.intValue;
video.length = [ele attributeForName:@"length"].stringValue.intValue;
video.name = [ele attributeForName:@"name"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.url = [ele attributeForName:@"url"].stringValue;
[videos addObject:video];
}
return videos;
}
2.SAX(NSXMLParser 苹果自带 需要使用代理
<NSXMLParserDelegate>
从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
// data 是获取到的xml数据
- (NSArray *)SAXparseXMLWithData:(NSData *)data
{
// 1.创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2.设置代理
parser.delegate = self;
// 3.开始解析
[parser parse]; // 卡住(解析完毕才会返回)
return self.videos;
}
#pragma mark - NSXMLParserDelegate
/**
* 开始解析文档时调用
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// NSLog(@"parserDidStartDocument----");
}
/**
* 结束解析文档时调用(解析完毕)
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// NSLog(@"parserDidEndDocument----");
}
/**
* 解析到一个元素的开头时调用 <videos>
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// NSLog(@"didStartElement----%@", elementName);
if ([@"videos" isEqualToString:elementName]) { // 解析到一个videos标签
self.videos = [NSMutableArray array];
} else if ([@"video" isEqualToString:elementName]) { // 解析到一个video标签, 创建一个模型
HMVideo *video = [HMVideo videoWithDict:attributeDict];
[self.videos addObject:video];
}
}
/**
* 解析到一个元素的结尾时调用 </videos>
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// NSLog(@"didEndElement----%@", elementName);
}