数据解析详解

1.什么是JSON数据.

{

1.JSON:是一种轻量级的传输数据格式,用于数据交互.

JSON是javascript语言的一个子集.javascript是个脚本语言(不需要编译),用来给HTML增加动态功能.

javascript和java没有半毛钱的关系!

服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外).

语法规则:

<1> 数据以键值的方式保存;

键(key)必须用双引号("key"),与键值之间以‘:‘分隔; {"name":"小明"}

<2> 数据和数据之间以逗号(,)分隔. {"name":"小明","age":13}

<3> {}表示对象. "person":{"name":"小明","age":13}

<4> []表示数组. "persons":[

{"name":"小明","age":13},

{"name":"小红","age":14},

{"name":"小花","age":15}

]

2.JSON与OC转换对照:

大括号 {} == NSDictionary;

中括号 [] == NSArray;

双引号" " == NSString;

数字13,13.5 == NSNumber;

3.数据传输过程:

客户端发送请求给服务器,服务器接收到客户端的请求之后,返回给客户端JSON数据.

客户端需要把服务器返回的JSON数据转换为OC的数据格式(数组/字典等).

}

/*------------------------------------ 数据解析: 2.JSON解析 --------------------------------*/

1.JSON数据解析

{

"ASI + SBJSON"

1.JSON数据解析方法:

在iOS中,常见的JSON数据解析方案有4种:

第三方框架: SBJson ,JSONKit, TouchJson.性能从左到右,依次变差.(iOS 5(2011年)以前)

苹果原生(自带):NSJSONSerialization (性能是最好的.iOS5以后推出).

2.解析JSON数据

<1>反序列化(解析):

将从服务器接收到的JSON数据(二进制数据)转换成OC数据类型(NSArray,NSDictionary等.)的过程.

目的: JSON数据 --> OC对象; 得到数据字典或者数据数组

好处: 简化程序的开发,方便后续的字典转模型.

方法:

+(id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

<2>序列化:

将数组或者字典发送给服务器之前,转换成二进制数据.

目的:OC对象 --> JSON数据;得到二进制JSON数据 NSData.

好处:方便网络传输,提高传输速度.

方法:

+(NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

"需要注意的是,在做序列化之前,一定要检测一下对象是否能够被序列化."

// 在做序列化之前,一定使用 isValidJSONObject 检测一下要序列化的对象,是否能够正确被序列化

// 避免出现闪退!

}

/*----------------------------------  数据解析: 3.XML数据 ----------------------------------*/

1.什么是XML

{

1.XML(eXtensible Markup Language)‘可扩展标记语言‘.

XML跟JSON一样,也是用来数据交互.

HTML是超文本标记语言.用来表示网页页面.

2.XML语法简介

一个完整的XML文件叫XML文档(XML Document).一个XML文档一般由以下几部分组成:

<1> 文档声明:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<2> 元素(Element)

1> 一个元素包括开始标签和结束标签.

<name>小红</name>

一个元素可以没有元素内容,没有元素内容可以简写.

</person>

XML中所有的空格和换行,都会当做具体的内容处理.

2> 一个元素可以嵌套若干个子元素(不能出现交叉嵌套).

<person>

<name>小花</name>

<age>16</age>

</person>

3> 规范的XML文档最多只能有一个根元素,其他元素都是根元素的子元素.

<3> 属性(Attribute)

1> 一个元素可以拥有多个属性.

<person name = "小明" age = "18"/>

2> 属性值必须用双引号""或者单引号‘‘括住.

3> 属性信息可以用元素内容来表示.

}

/*----------------------------------  数据解析: 4.XML解析 ----------------------------------*/

1.XML两种解析方式. 2.解析方式的选择.

{

XML解析:

所谓XML解析,指的就是将XML中元素的内容取出来或者将元素中的属性值提取出来.

XML解析方式: 1.SAX 2.DOM

1.SAX解析:

从根元素开始,一个元素一个元素的按顺序往下解析.

比较适合大文件的解析.

* 解析方法:

苹果原生: NSXMLParser ,使用简单.设置代理就可以了.

NSXMLParser 采用SAX方式逐行往下解析,当扫描到下面的情况都会通知代理.

<1> 扫描到文档(Doucument)的开始与结束的时候,会通知代理.

<2> 扫描到元素(Element)的开始与结束的时候,会通知代理.

<3> 扫描到元素中的内容的时候,会通知代理.

* 使用步骤:

{

// 1.传入XML,创建解析器

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

// 2.设置代理,监听解析过程

parser.delegate = self;

// 3.开始解析

[parser parse];

// 4.解析完毕之后刷新表格数据

[self.tableView reloadData];

// 4.实现代理方法

{

// 1.当扫描到文档的开始时调用(开始解析)

- (void)parserDidStartDocument:(NSXMLParser *)parser;

// 2.当扫描到元素的开始时调用(attributeDict存放着元素的属性)

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;

// 3.发现元素中的内容的时候开始调用

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;

// 4.当扫描到元素结束时调用

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;

// 5.当扫描到文档的结束时调用(解析完毕)

- (void)parserDidEndDocument:(NSXMLParser *)parser;

}

}

2.DOM解析:

一次性将整个XML文档加载进内存,内存消耗比较大.

比较适合小文件.更加适用于Mac.

* 解析方法:

第三方框架:

* libxml2: 纯C语言,默认包含在iOS SDK中,同时支持SAX和DOM方式解析.

* GDateXML: DOM方式解析,由Google开发,基于libxml2.

* GDataXML使用步骤:

{

<1> 导入第三方框架 GDateXML;

<2> 注意修改三个地方:

1> Header Search Paths : /usr/include/libxml2

2> Other Linker Flags : -lxml2

3> 添加非ARC :-fno-objc-arc

<3> 使用方法:

{

// 1.加载整个XML文档

GDataXMLDocument *dom = [[GDataXMLDocument alloc] initWithData:data options:0 error:NULL];

// 2.获得文档的根元素

GDataXMLElement *element = dom.rootElement;

// 3.得到根元素中包含的元素(vedio元素)

[element.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

GDataXMLElement *vedio = obj;

ITVedio *ITvedio = [[ITVedio alloc] init];

// 4.得到vedio元素中包含的元素内容

[vedio.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

GDataXMLElement *ele = obj;

// 5.将元素内容取出赋值.

[ITvedio setValue:ele.stringValue forKeyPath:ele.name];

}];

// 将数据模型放在数据源中.

[self.vedios addObject:ITvedio];

}];

}

}

}

{

注意:播放视频

1. 导入: MediaPlayer/MediaPlayer.h

#import <MediaPlayer/MediaPlayer.h>

2. 创建视频播放控制器

MPMoviePlayerViewController *mv = [[MPMoviePlayerViewController alloc] initWithContentURL:url];

3. 跳转到控制器播放视频

[self presentMoviePlayerViewControllerAnimated:mv];

NSNumber 替代 int,防止 null 错误.

NSArray + Log 分类,打印汉字,方便调试.

}

时间: 2024-10-18 20:09:30

数据解析详解的相关文章

ini格式数据生成与解析详解

ini格式数据生成与解析详解 1.ini格式数据长啥样? 2.ini格式数据简介 INI文件的命名来源,是取自英文"初始(Initial)"的首字缩写,正与它的用途--初始化程序相应. 有时候,INI文件也会以不同的扩展名,如".cfg".".conf"(在Linux系统中也常用到).或是".txt"代替(从辨识度的角度,不建议使用). 3.ini格式数据适用场景 INI文件是一个无固定标准格式的配置文件.它以简单的文字与简单

JVM 运行时数据区详解

一.运行时数据区: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域. 1.有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,所有的线程共享这些数据区. 2.第二种则是与线程一一对应,随线程的开始和结束而创建和销毁,线程之间相互隔离. java虚拟机所管理的内存将会包括以下几个运行时数据区域 二.数据区详解 1.程序计数器(Program Counter Register) 也叫PC寄存器是一块较小的内存空间,它的作用是存储当前线程所执行的字节码的信号指示器.

android Json解析详解

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为– Json.org JSON Vs XML 1.JSON和XML的数据可读性基本相同 2.JSON和XML同样拥有丰富的解析手段 3.JSON相对于XML来讲,数据的体积小 4.JSON与JavaScript的交互更加方便

ContentProvider数据访问详解

ContentProvider数据访问详解 Android官方指出的数据存储方式总共有五种:Shared Preferences.网络存储.文件存储.外储存储.SQLite,这些存储方式一般都只是在一个单独的应用程序中实现数据的共享,而对于需要操作其他应用程序中的数据时(如媒体库.通讯录等),可能就需要借助ContentProvider了. 1.ContentProvider ContentProvider为存储和获取数据提供了统一的接口,使用表的形式来对数据进行封装,使得开发者在后续的开发过程

nginx学习三 nginx配置项解析详解及代码实现

nginx配置项解析详解及代码实现 0回顾 在上一节,用nginx简单实现了一个hello world程序:当我们在浏览器中输入lochost/hello ,浏览器就返回:hello world.为什么会这样呢,简单一点说就是当我们请求访问hello这个服务,nginx就会看配置文件中是否有,如果有,根据具体的handler处理后把处理的结果返回给用户,没有就返回not found. location /hello { test_hello ;//无参数的配置 这其实是一个简单的配置.这节我们来

IA-32指令解析详解

IA-32指令解析详解 0x00 前言 这段时间忙于考试,信息论和最优化,还有算法分析,有点让人头大.期间花了几天看SEH机制,能明白个大概,但是对于VC++对于SHE的包装似乎还是不是很明白,发现逆向工程核心原理对于这段写的太简单,至于加密与解密则是模棱两可,软件加密技术内幕倒是详解了,可是太老了,代码又是汇编写的总是编译不通过.真是让人难受!本来想写一篇SEH详解,但是基于以上原因暂时搁置.这两天看了逆向核心原理关于IA-32指令解析的内容,发现还是挺有意思,遂记录下来. 0x01 何谓IA

Rxjava2 Observable的数据过滤详解及实例(一)

目录 简要: 1. Debounce 1.1 debounce(timeout, unit) 1.2 debounce(debounceSelector) 2. Throttle 2.1 throttleFirst(windowDuration, unit) 2.2 throttleLast(intervalDuration, unit) 2.3 throttleWithTimeout(timeout, unit) 3. Sample 3.1 sample(period, unit) 3.2 s

Rxjava2 Observable的数据变换详解及实例(二)

目录 1. Window 1.1 window(closingSelector) 1.2 window(openingIndicator, closingIndicator) 1.3 window(count) 1.4 window(count, skip) 1.5 window(timespan, TimeUnit) 1.6 window(timespan, TimeUnit, count) 1.7 window(timespan, timeskip, TimeUnit) 2. GroupBy

Rxjava2 Observable的数据变换详解及实例(一)

目录 简要: 1.1 buffer(count) 1.2 buffer(boundary) 1.3 buffer(count, skip) 1.4 buffer(timespan, TimeUnit) 1.5 buffer(timespan, TimeUnit, count) 1.6 buffer(timespan, timeskip, TimeUnit) 1.7 buffer(bufferClosingSelector) 2. Map 3. FlatMap 3.1 flatMap(mapper