NSJSONSerialization

接下来就正式开始。苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂。

首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要加载一个NSURL对象,来向网站提交一个Request。到这里需要特别注意了,iOS9的时代已经来临,我们先前在旧版本中使用的某些类或者方法都已经被苹果官方弃用了。刚刚我们向网站提交了一个Request,在以往,我们是通过NSURLConnection中的sendSynchronousRequest方法来接受网站返回的Response的,但是在iOS9中,它已经不再使用了。从官方文档中,我们追根溯源,找到了它的替代品——NSURLSession类。这个类是iOS7中新的网络接口,苹果力推之,并且现在用它完全替代了NSURLConnection。关于它的具体用法,还是蛮简单的,直接上代码(ViewController.m文件):

文/神兽gcc(简书作者)
原文链接:http://www.jianshu.com/p/a54d367adb2a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
#import "ViewController.h"@interface ViewController () @property (retain, nonatomic) IBOutlet UITextView *textView; @property (nonatomic, strong) NSMutableDictionary *dic; @property (nonatomic,strong) NSString *text; @end @implementation ViewController - (IBAction)NSJson:(UIButton *)sender { //GCD异步实现 dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(q1, ^{ //加载一个NSURL对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://api.douban.com/v2/movie/subject/25881786"]]; //使用NSURLSession获取网络返回的Json并处理 NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error){ //从网络返回了Json数据,我们调用NSJSONSerialization解析它,将JSON数据转换为Foundation对象(这里是一个字典) self.dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSString *title = [self.dic objectForKey:@"original_title"]; NSMutableArray *genresArray = [self.dic objectForKey:@"genres"]; NSString *genres = [NSString stringWithFormat:@"%@/%@", [genresArray objectAtIndex:0], [genresArray objectAtIndex:1]]; NSString *summary = [self.dic objectForKey:@"summary"]; self.text = [NSString stringWithFormat:@"电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@", title, genres, summary]; //更新UI操作需要在主线程 dispatch_async(dispatch_get_main_queue(), ^{ self.textView.text = self.text; }); }]; //调用任务 [task resume]; }); }

NSXMLParse

关于XML,有两种解析方式,分别是SAX(Simple API for XML,基于事件驱动的解析方式,逐行解析数据,采用协议回调机制)和DOM(Document Object Model ,文档对象模型。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写)。苹果官方原生的NSXMLParse类库采用第一种方式,即SAX方式解析XML,它基于事件通知的模式,一边读取文档一边解析数据,不用等待文档全部读入以后再解析,所以如果你正打印解析的数据,而解析过程中间出现了错误,那么在错误节点之间的数据会正常打印,错误后面的数据不会被打印。解析过程由NSXMLParserDelegate协议方法回调。

文/神兽gcc(简书作者)
原文链接:http://www.jianshu.com/p/a54d367adb2a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

我们遵循MVC,首先我们创建模型,新建一个person类,存放XML文件中描述的person属性。再来一个解析XML文件的工具类XMLUtil,我们在里面实现文件的获取,代理方法的实现。

先来看这两个类的代码:

//person.h#import <Foundation/Foundation.h>@interface person : NSObject @property (nonatomic, copy) NSString *pid; @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSString *sex; @property (nonatomic, copy) NSString *age; @end
//XMLUtil.h#import <Foundation/Foundation.h>
#import "person.h" //声明代理 @interface XMLUtil : NSObject<NSXMLParserDelegate> //添加属性 @property (nonatomic, strong) NSXMLParser *par; @property (nonatomic, strong) person *person; //存放每个person @property (nonatomic, strong) NSMutableArray *list; //标记当前标签,以索引找到XML文件内容 @property (nonatomic, copy) NSString *currentElement; //声明parse方法,通过它实现解析 -(void)parse; @end //XMLUtil.m #import "XMLUtil.h" @implementation XMLUtil - (instancetype)init{ self = [super init]; if (self) { //获取事先准备好的XML文件 NSBundle *b = [NSBundle mainBundle]; NSString *path = [b pathForResource:@"test" ofType:@".xml"]; NSData *data = [NSData dataWithContentsOfFile:path]; self.par = [[NSXMLParser alloc]initWithData:data]; //添加代理 self.par.delegate = self; //初始化数组,存放解析后的数据 self.list = [NSMutableArray arrayWithCapacity:5]; } return self; } //几个代理方法的实现,是按逻辑上的顺序排列的,但实际调用过程中中间三个可能因为循环等问题乱掉顺序 //开始解析 - (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"parserDidStartDocument..."); } //准备节点 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{ self.currentElement = elementName; if ([self.currentElement isEqualToString:@"student"]){ self.person = [[person alloc]init]; } } //获取节点内容 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ if ([self.currentElement isEqualToString:@"pid"]) { [self.person setPid:string]; }else if ([self.currentElement isEqualToString:@"name"]){ [self.person setName:string]; }else if ([self.currentElement isEqualToString:@"sex"]){ [self.person setSex:string]; }else if ([self.currentElement isEqualToString:@"age"]){ [self.person setAge:string]; } } //解析完一个节点 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{ if ([elementName isEqualToString:@"student"]) { [self.list addObject:self.person]; } self.currentElement = nil; } //解析结束 - (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"parserDidEndDocument..."); } //外部调用接口 -(void)parse{ [self.par parse]; } @end

OK,总算是大功告成,如果对代理的使用比较熟悉的话,这部分内容其实还蛮简单的。如果被代码转来转去弄晕了的话可以在每个block的最后都加一个打印输出,做好标记,你就能弄懂程序的执行顺序了。

我们点击NSXMLParse,有了!

转载于:https://www.cnblogs.com/supper-Ho/p/6209210.html

iOS开发——XML/JSON数据解析相关推荐

  1. ios开发值json数据文件的存取

    将Json存进本地文件夹 NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMas ...

  2. java数组里套数组_用JAVA进行Json数据解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...

  3. spark中读取json_【spark】文件读写和JSON数据解析

    1.读文件 通过 sc.textFile("file://")方法来读取文件到rdd中. val lines = sc.textFile("file://")/ ...

  4. iOS进阶(XML、JSON数据解析)

    1.XML解析之DOM解析 需要用到libxml2.dylib框架 和GDataXMLNode工具 DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中.从而消耗很大的内存空间.DOM ...

  5. linux下json数据解析,JSON数据解析 - iOS学习笔记_Linux编程_Linux公社-Linux系统门户网站...

    在之前的<iOS学习--xml数据解析(九)>http://www.linuxidc.com/Linux/2014-02/97020p9.htm 介绍了xml数据解析,这一篇简单介绍一下J ...

  6. 在线解析xml,json数据的网址

    在线解析xml,json数据的网址 https://www.sojson.com/yasuoyihang.html

  7. Android学习笔记44:JSON数据解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...

  8. Linux7081端口,bash,linux_利用shell将json数据解析后排序问题,bash,linux,ubuntu,json - phpStudy...

    利用shell将json数据解析后排序问题 最近在写一个模仿dropbox_uploader的百度网盘的shell脚本.通过调用pcs的api返回一个目录下的所有文件.返回的json数据如下: {&q ...

  9. iOS开发系列--UITableView全面解析

    iOS开发系列--UITableView全面解析 2014-08-23 23:20 by KenshinCui, 2202 阅读, 18 评论, 收藏,  编辑 --UIKit之UITableView ...

最新文章

  1. 直播报名 | 官方解读NVIDIA黑科技:StyleGAN的架构与实现
  2. java 银行存取款_用Java编写银行存钱取钱
  3. 解决SerMyAdmin无法登陆的问题
  4. js 获取中括号里面字符串_一日一技:一次性把字符串用多个分隔符分割
  5. servlet后端连接 微信小程序与_微信小程序授权登录
  6. 如何自己开发漏洞扫描工具
  7. databinding包名不能大写?——不改包名解决databinding与包名大写的冲突Android
  8. Playmaker节点工具使用(三)—扩展playmaker
  9. ERROR: torch-1.6.0+cu101-cp37-cp37m-win_amd64.whl is not a supported wheel on this platform.
  10. -moz-zoom-in 和-moz-zoom-out
  11. 教育惩戒权终于来了,能杜绝“拦路打老师案”的剧情吗?
  12. SIM900A保姆级调试日记
  13. JMockit 介绍 4 使用JMockit运行测试
  14. leetcode每日一题 911在线选举
  15. mendelay为什么安装不了_方舟生存进化手游国际版出现解析包错误和解析包错误以及下载完无法安装这样应对...
  16. matlab的diag函数
  17. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]
  18. 声网Agora Signaling SD例子运行方法
  19. 基于蓝牙串口通信,实现实时脉象采集(项目总结与思路梳理)
  20. 禁止开机时软件自启动的三种方法

热门文章

  1. Tips - C++
  2. 一个需要原创精神的年代
  3. 记与公司内网微博的谈话
  4. visual stadio 添加 Extjs 智能提示!
  5. Liverpool一日游
  6. what to improve on my case study?
  7. 子线程适当Sleep的重要性
  8. Django入门项目实践(中)
  9. 关于python编码的问题
  10. mysql 乐观锁和悲观锁