iOS开发之JSON & XML

1、概述

JSON

(1) 作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式

(2) 基于JavaScript的一个子集

(3) 易读性略差,编码手写难度大,数据量小

(4) JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,我们会陷入繁琐复杂的数据节点查找中

XML

(1)可扩展标记语言

(2)用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言

(3)易读性高,编码手写难度小,数据量大

客户端与服务器数据传输示意图:

 

2JSON格式说明

n  对象

n  {}

n  格式 {key : value, key : value,...} 的键值对的结构

n  可以反序列化为OC中的NSDictionary

n  数组

n  []

n  格式 ["java","javascript","vb",...]

n  可以反序列化为OC中的NSArray

n  提示

n  JSON的数据格式与OC中的快速包装方法非常类似

n  JSON的数据格式同样支持嵌套

3、解析服务器端返回JSON数据

n  从iOS 5开始,使用NSJSONSerialization对JSON解析

n  其他常见的三种JSON解析第三方库:

n  SBJson     因为API简单易用,可能还会有一些应用中留存

n  JSONKit   JSONKit的开发者称:JSONKit的性能优于苹果

n  TouchJson

4JSON的序列化和反序列化

反序列化

[NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

例如:

- (void)getLogon2

{

[self.view endEditing:YES];

 // 1. URL

NSString *urlStr =

[NSString stringWithFormat:@"http://192.168.40.2/

login.php?username=%@&password=%@", self.userName.text, self.userPwd.text];

   

    // 如果URL中包含中文字符或者特殊字符,例如空格,需要添加百分号转义

urlStr =

[urlStr stringByAddingPercentEscapesUsingEncoding:

NSUTF8StringEncoding];

   

    NSURL *url = [NSURL URLWithString:urlStr];

   

    // 2. NSURLRequest

    /**

     参数:

     timeoutInterval:开发中一定要指定超时时长,默认60秒,通常靠考虑到用户的网络环境,可以设置到10~20秒,不能太长,也不能太短

     */

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:5.0f];

   

    // 3. 发送异步请求

[NSURLConnection sendAsynchronousRequest:request queue:

[[NSOperationQueue alloc] init] completionHandler:

^(NSURLResponse *response, NSData *data, NSError *connectionError) {

       

        if (connectionError) {

            [self showAlertViewWithMsg:@"网络不给力"];

           

            return;

        } else {

            // 将接收到的二进制数据反序列化为数据字典

            NSDictionary *dict =

[NSJSONSerialization JSONObjectWithData:data

options:nil error:NULL];

           

            LoginUser *user = [[LoginUser alloc] initWithDict:dict];

           

            // 如果用户有头像就加载头像

            if (user.userImage) {

                dispatch_async(dispatch_get_main_queue(), ^{

                    self.imageView.image =

[user loadImageWithURL:user.userImage];

                });

            }

           

            // 用户登录错误?不会网络连接失败!

            if (!user.userId) {

                [self showAlertViewWithMsg:@"用户名或者密码不正确"];

               

                return;

            }

           

            [[NSOperationQueue mainQueue]

addOperationWithBlock:^{

                self.logonResult.text = @"登录完成";

            }];

        }

    }];

}

 

序列化

[NSJSONSerialization dataWithJSONObject:array options:0 error:NULL];

5NSXMLParser

1NSXMLParser解析方法

n  NSXMLParser是SAX方法解析

n  SAXSimple API for XML

n  只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快

n  常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台

n  从文档的开始通过每一节点移动,定位一个特定的节点

n  DOMDocument Object Model

n  不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档

n  一般应用与小型的配置XML,方便操作

n  为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构

n  在内存中生成节点树操作代价昂贵

 

1、         解析步骤:

【备注】属性:

@property (nonatomic, strong) NSMutableArray *dataList;

// 来回拼接

@property (nonatomic, strong) NSMutableString *elementString;

// 当前视频信息的对象

@property (nonatomic, strong) Video *v;

还要遵守代理协议:NSXMLParserDelegate

示例代码:

- (IBAction)loadData

{

// 1. URL

NSURL *url =

[NSURL URLWithString:@"http://localhost/videos.php"];

    // 2. Request

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10.0f];

    // 3. 发送请求

[NSURLConnection sendAsynchronousRequest:request queue:

[[NSOperationQueue alloc] init]completionHandler:

^(NSURLResponse *response, NSData *data, NSError *connectionError) {

//第一步:实例化NSXMLParser,传入从服务器接收的XML数据

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

//第二步:定义解析器代理

  parser.delegate = self;

//第三步:解析器解析

[parser parse];

}];

}

 

//第四步:通过解析代理方法完成XML数据的解析

#pragma mark 1. 开始

- (void)parserDidStartDocument:(NSXMLParser *)parser

{

    // 准备工作

    // 1> dataList

    if (!self.dataList) {

        self.dataList = [NSMutableArray array];

    } else {

        [self.dataList removeAllObjects];

    }

   

    // 2> elementString

    if (!self.elementString) {

        self.elementString = [NSMutableString string];

    } else {

        // 清空可变字符串不要设置成nil,使用setString只是清空内容,下次不会再次实例化

        [self.elementString setString:@""];

    }

}

 

#pragma mark 2. 所有开始一个节点:<element>

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

{

    // 如果是<video>新建对象

    if ([elementName isEqualToString:@"video"]) {

        self.v = [[Video alloc] init];

        self.v.videoId = attributeDict[@"videoId"];

    }

   

    // 每开始一个新节点之前都清空elementString

    // 避免上一次的结果被重复拼接

    [self.elementString setString:@""];

}

 

#pragma mark 3. 查找内容,可能会重复多次

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

{

    // 拼接字符串

    [self.elementString appendString:string];

}

 

#pragma mark 4. 节点结束 </element>

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

{

    NSLog(@"结束节点 %@", elementName);

    // 判断如果是<name>要复制

    if ([elementName isEqualToString:@"video"]) {

        [self.dataList addObject:self.v];

    } else if (![elementName isEqualToString:@"videos"]) {

        [self.v setValue:self.elementString forKey:elementName];

    }

 

}

 

#pragma mark 5. 文档结束

- (void)parserDidEndDocument:(NSXMLParser *)parser

{

    NSLog(@"解析结束 %@ %@", self.dataList, [NSThread currentThread]);

   

    dispatch_async(dispatch_get_main_queue(), ^{

        [self.tableView reloadData];

       

        // 关闭刷新控件的刷新

        [self.refreshControl endRefreshing];

    });

}

 

#pragma mark 6. 出错处理

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError

{

    NSLog(@"%@", parseError.localizedDescription);

}

3NSXMLParser解析代理方法

// 1. 开始解析XML文档

- (void)parserDidStartDocument:

// 2. 开始解析某个元素,会遍历整个XML,识别元素节点名称

- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:

// 3. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销

- (void)parser:foundCharacters:

// 4. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息

- (void)parser:didEndElement:namespaceURI:qualifiedName:

注意:在解析过程中,2、3、4三个方法会不停的重复执行,直到遍历完成为止

// 5. 解析XML文档结束

- (void)parserDidEndDocument:

// 6. 解析出错

- (void)parser:parseErrorOccurred:

时间: 2016-05-10

iOS开发之JSON & XML的相关文章

iOS开发之JSON解析

JSON解析步骤: - (NSArray *)products {     if (_products == nil) { //第一步:获取JSON文件的路径: NSString *path = [[NSBundle mainBundle] pathForResource:@"products.json" ofType:nil];         //第二步:加载JSON文件: NSData *data = [NSData dataWithContentsOfFile:path];  

iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码_IOS

废话不多说了,直接给大家贴代码了. 具体代码如下所示: #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableViewCell.h" #define kDeviceWidth [UIScreen mainScreen].bounds.size.width #define kDeviceHeight [UIScreen mainScreen].bounds.

iOS开发之URLSession

1.概述 n  NSURLSession是iOS7中新的网络接口,与NSURLConnection是并列的. n  当程序在前台时,NSURLSession与NSURLConnection大部分可以互相替代 n  NSURLSession支持后台网络操作,除非用户强行关闭 n  NSURLSession提供的功能: p 通过URL将数据下载到内存 p 通过URL将数据下载到文件系统 p 将数据上传到指定URL p 在后台完成上述功能 p 对于小型数据,例如用户登录.下载小图像.JSON & XM

iOS开发之AFNetworking

1.概述 AFNetworking简称AFN,是iOS开发中主流第三方框架之一.苹果的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各种序列化的操作,同时还要考虑请求数据的安全等一堆问题.而AFNetworking帮我们简化了网络操作. 2.早前的几个网络框架 1.ASI框架: HTTP终结者.很牛, 但是有BUG, 已经停止更新. 2.MKNetworkKit

iOS开发之CoreLocation(GPS定位)

1.概述 在iOS开发中,要想加入地图和定位功能这2大功能,必须基于2个框架进行开发 (1)Map Kit :用于地图展示 (2)Core Location :用于地理定位 2个热门专业术语: LBS :Location Based Service SoLoMo :Social Local Mobile(索罗门) 2.CoreLocation框架的使用 CoreLocation框架使用前提: 导入框架: 导入主头文件: #import <CoreLocation/CoreLocation.h>

iOS开发之SQLite--C语言接口规范(五)——iOS开发使用SQLite实例

本篇博客就使用前面操作SQLite的知识来实现如何去插入,删除和更新数据.然后再把操作SQlite数据库常用的方法进行一个封装.把常用方法进行封装后,把Cars数据库中的其中一个表的数据进行查询,并在UITableView上进行展示.因为本实例要对数据库的数据进行modify(修改)操作 ,在iOS系统上呢,为了安全起见,在Bundle中的数据库资源是不允许进行数据的插入修改和删除操作的.在之前的博客中我们只进行了查询操作,所以从Bundle加载数据库资源文件是可行的. 如果对数据库进程inse

iOS开发之Autolayout

1.概述 在以前的iOS程序中,是如何设置布局UI界面的? (1)经常编写大量的坐标计算代码 (2)为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还需要分别为2种屏幕编写不同的坐标计算代码(即传说中的"屏幕适配") 什么是Autolayout? (1)Autolayout是一种"自动布局"技术,专门用来布局UI界面的 (2)Autolayout自iOS 6开始引入,由于Xcode 4的不给力,当时并没有得到很大推广 (3)自iOS

iOS开发之MJRefresh

1.概述 MJRefresh是iOS开发中最常用的开源框架之一,主要用于UITanleView的下拉.上拉刷新.本框架兼容iOS6\iOS7,iPhone\iPad横竖屏,目前大多数商业app中都用到了这个框架. 框架地址:https://github.com/CoderMJLee/MJRefresh 2.使用方法 (1)下载框架,导入头文件 ? 1 #import "MJRefresh.h" (2)添加头部控件的方法 ? 1 [self.tableView addHeaderWith

iOS开发之XMPP开发环境的配置

1.概述 XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性.因此,基于XMPP的应用具有超强的可扩展性.经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序.而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能. 2.环境搭建 下载xmppframework这个框架,框架下载链接如下:https://githu

iOS开发之ReactiveCocoa下的MVVM(干货分享)

最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团队协作>,大体上讲的就是使用Block回调的方式实现MVVM的.在写上篇文章时也知道有ReactiveCocoa这个函数响应式编程的框架,并且有许多人用它来更好的实现MVVM.所以在上篇博客发表后,有些同行给评论建议看一下ReactiveCocoa的东西,所以就系统的看了一下ReactiveCocoa的