解析JSON XML

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"}]}

JSONOC 转换对照表

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.SAXNSXMLParser 苹果自带 需要使用代理

<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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dwt1220

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值