JSON数据

  1. {"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;

  1. // data 是获取到的json数据
  2. - (NSArray *)parseJSONData:(NSData *)data
  3. {
  4. // 解析数据 (使用NSJSONSerialization 系统原生json解析类)
  5. NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
  6. NSArray *array = dict[@"videos"];
  7. NSMutableArray *videos = [NSMutableArray array];
  8. for (NSDictionary *videoDict in array) {
  9. HMVideo *video = [HMVideo videoWithDict:videoDict];
  10. [videos addObject:video];
  11. }
  12. return videos;
  13. }
OC对象 --> JSON数据

+ (NSData *)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError**)error;

XML(ExtensibleMarkupLanguage,译作“可扩展标记语言”)

  1. <videos>
  2. <video name="小黄人 第01部" length="30" />
  3. <video name="小黄人 第02部" length="19" />
  4. <video name="小黄人 第03部" length="33" />
  5. </videos>
XML的解析方式有2种
DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
iOS中,解析XML的手段有很多
苹果原生
NSXMLParser:SAX方式解析,使用简单
 
第三方框架
libxml2:纯C语言,默认包含在iOSSDK中,同时支持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库)
在OtherLinkerFlags中加入-lxml2
 
由于GDataXML是非ARC的,因此得设置编译参数
 

GDataXML使用

GDataXML中常用的类
GDataXMLDocument:代表整个XML文档
 
GDataXMLElement
代表文档中的每个元素
使用attributeForName:方法可以获得属性值

例如:

  1. // data 是获取到的xml数据
  2. - (NSArray *)DOMparseXMLWithData:(NSData *)data
  3. {
  4. // 1.加载文档
  5. GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
  6. // 2.获得根元素
  7. GDataXMLElement *root = doc.rootElement;
  8. // 3.获得所有video元素
  9. NSArray *elements = [root elementsForName:@"video"];
  10. // 4.将GDataXMLElement对象转成HMVideo模型
  11. NSMutableArray *videos = [NSMutableArray array];
  12. for (GDataXMLElement *ele in elements) {
  13. HMVideo *video = [[HMVideo alloc] init];
  14. video.ID = [ele attributeForName:@"id"].stringValue.intValue;
  15. video.length = [ele attributeForName:@"length"].stringValue.intValue;
  16. video.name = [ele attributeForName:@"name"].stringValue;
  17. video.image = [ele attributeForName:@"image"].stringValue;
  18. video.url = [ele attributeForName:@"url"].stringValue;
  19. [videos addObject:video];
  20. }
  21. return videos;
  22. }

2.SAX(NSXMLParser 苹果自带 需要使用代理

<NSXMLParserDelegate>

从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

    1. // data 是获取到的xml数据
    2. - (NSArray *)SAXparseXMLWithData:(NSData *)data
    3. {
    4. // 1.创建解析器
    5. NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    6. // 2.设置代理
    7. parser.delegate = self;
    8. // 3.开始解析
    9. [parser parse]; // 卡住(解析完毕才会返回)
    10. return self.videos;
    11. }
    12. #pragma mark - NSXMLParserDelegate
    13. /**
    14. *  开始解析文档时调用
    15. */
    16. - (void)parserDidStartDocument:(NSXMLParser *)parser
    17. {
    18. //    NSLog(@"parserDidStartDocument----");
    19. }
    20. /**
    21. *  结束解析文档时调用(解析完毕)
    22. */
    23. - (void)parserDidEndDocument:(NSXMLParser *)parser
    24. {
    25. //    NSLog(@"parserDidEndDocument----");
    26. }
    27. /**
    28. *  解析到一个元素的开头时调用 <videos>
    29. */
    30. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    31. {
    32. //    NSLog(@"didStartElement----%@", elementName);
    33. if ([@"videos" isEqualToString:elementName]) { // 解析到一个videos标签
    34. self.videos = [NSMutableArray array];
    35. } else if ([@"video" isEqualToString:elementName]) { // 解析到一个video标签, 创建一个模型
    36. HMVideo *video = [HMVideo videoWithDict:attributeDict];
    37. [self.videos addObject:video];
    38. }
    39. }
    40. /**
    41. *  解析到一个元素的结尾时调用 </videos>
    42. */
    43. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    44. {
    45. //    NSLog(@"didEndElement----%@", elementName);
    46. }

链接地址:http://blog.csdn.net/dwt1220/article/details/45222119

(转)解析json xml的更多相关文章

  1. JSON解析和XML解析对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...

  2. 数据解析(XML和JSON数据结构)

    一   解析 二 XML数据结构 三 JSON 数据结构     一 解析 1  定义: 从事先规定好的格式中提取数据     解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照 ...

  3. ios之json,xml解析

    JSON解析步骤: 1.获取json文件路径 NSString*path = [[NSBundle mainBundle] pathForResource:@"Teacher"of ...

  4. iOS网络-02-数据解析(JSON与XML)

    数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...

  5. [转]解析json:与array,list,map,bean,xml相互转化

    一.解析json之net.sf.json 下载地址 使用netsfjson需要导入的包 JSONObject JSONArray JavaBean与json字符串互转 List与json字符串互转 M ...

  6. JSON解析和XML解析

    一. XML:用到一个开源解析类,GDataXMLNode(将其加入项目中),添加libxml2.dylib框架 经常用到的方法: 1.- (id)initWithXMLString:(NSStrin ...

  7. 在.NET2.0中解析Json和Xml

    在.NET解析json有很多方法,这里介绍最简单也用的最多的一种. 一.添加引用 解析Json,先下载开源控件 Newtonsoft.Json.dll 下载地址:http://files.cnblog ...

  8. ios 解析json,xml

    一.发送用户名和密码给服务器(走HTTP协议) // 创建一个URL : 请求路径    NSString *urlStr = [NSString stringWithFormat:@"ht ...

  9. UI进阶 解析XML 解析JSON

    1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSO ...

随机推荐

  1. 【BZOJ 4605】崂山白花蛇草水 替罪羊树套线段树

    外层是借鉴了kd-tree的替罪羊里层是线段树,插入就是正常插入+拍扁重建,查询的时候,我们就像树状数组套线段树一样操作在替罪羊中找到的线段树根节点,但是对于在kd-tree查找过程中遇到的单点,我们 ...

  2. 【BZOJ 3123】 [Sdoi2013]森林 主席树启发式合并

    我们直接按父子关系建主席树,然后记录倍增方便以后求LCA,同时用并查集维护根节点,而且还要记录根节点对应的size,用来对其启发式合并,然后每当我们合并的时候我们都要暴力拆小的一部分重复以上部分,总时 ...

  3. HTML5 Canvas圣诞树

    又逢圣诞了,为了让小站NowaMagic有点节日气氛,这里也弄一棵圣诞树放放-大家可以先看下效果. 效果演示 <canvas id="c"></canvas> ...

  4. Fragment使用--文章集锦

    android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态 Android Fragment 真正的完全解析(上) Android Fragment实 ...

  5. Struts2 利用拦截器 interceptor 控制登陆和访问权限

    最近学习了Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultSta ...

  6. Lesson 3

    1.关于面向对象的三个重要属性  Encapsulation(封装):无法直接访问类的成员变量,而是通过一些get set方法,间接访问数据域: Polymorphism(多态):静态绑定,动态绑定, ...

  7. 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)

    本文属于本人原创,转载请注明出处:http://blog.csdn.net/xxd851116/archive/2009/06/25/4296866.aspx [前面的话] 在网上经常看到有人对req ...

  8. eclipse怎样快速的给代码段添加try catch

    打开要进行异常处理的java代码页面. 选中要添加try..catch的代码段,然后点击鼠标右键,选择[Sourround With]选项. 然后选择[Try/Catch Block]或者[6 try ...

  9. Java环境变量配置以及作用、JDK与JRE区别以及命令行引入jar包

    在配置环境变量中: 设置JAVA_HOME: 一是为了方便引用,比如,JDK安装在C:\jdk1.6.0目录里,则设置JAVA_HOME为该目录路径, 那么以后要使用这个路径的时候, 只需输入%JAV ...

  10. 详解SHOW PROCESSLIST显示哪些线程正在运行列出的状态

    SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到所有线程.否则,您只能看到您自己的线程( ...