iOS 网络编程:JSON解析
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
1 JSON文档结构
1.1 简介
JSON(javaScript Object Notation)是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析,是一种轻量级的数据交换格式。所谓轻量级是指与XML文档结构相比描述相同的数据所需的字符个数要少。
简单的说JSON由两种数据类型组成:数组和词典。
1.2 语法
JSON 语法是 JavaScript 语法的子集,但对于IOS开发来说,可以不需要太多了解JavaScript语法。
1) JSON 语法规则
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象(无序容器)
- 方括号保存数组(有序容器)
2) JSON 名称/值对
名称/值对相当是IOS中的词典,即是映射表,但是JSON中的"名称"必须是由字符串表示。 名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"firstName" : "John"
3) JSON 值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
图 1
4) JSON 对象
JSON 对象在花括号中书写,对象可以包含多个"名称/值"对,即对象是一个无序的"名称/值"对集合。
图 2
firstName":"John" , "lastName":"Doe" }
5) JSON 数组
JSON 数组在方括号中书写,数组可包含多个对象,即数组是值的有序集合。
图 3
{ "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }
在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
2 JSON数据解码
2.1 IOS解码技术
目前有如下的几种解码技术,性能是从低到高排序,
- JBjson:比较老的第三方框架;
- TouchJSON:也是老的第三方框架;
- YAJL:也是比较老,但性能较高;
- JSONKit:比较优秀的JSON框架,解码速度快;
- NSJSONSerialization:它是IOS5之后Apple提供的官方API,是目前最优秀的JSON编码/解码框架。
2.2 NSJSONSerialization
在IOS中对JSON文件的解码和编码是通过NSJSONSerialization类实现的,该类的使用方式非常方便和简单。NSJSONSerialization类的设计思想是通过一个"中介对象"与JSON文件进行互相转换。
2.2.1 以NSData为中介
由于NSData对象能够直接与文件进行交互,所以就能够以NSData对象为中间转换介质,如下图所示的转换过程。
注意:
这里的JSON对象可以是数组、词典等类型,具体看最外层"{}"内的类型。
如下所示的"Notes.json" JSON文件,
{ "ResultCode":110, "Record":112 }
如下的程序是对JSON文件进行解析为字典,然后验证是否正确;接着重新将字典编码为JSON文件。
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 // Do any additional setup after loading the view, typically from a nib. 4 5 NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 6 7 NSData *jsonData = [[NSData alloc] initWithContentsOfFile:path]; 8 id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 9 10 NSInteger id = [jsonObj objectForKey:@"ResultCode"]; 11 NSLog(@"%@",[jsonObj objectForKey:@"ResultCode"]); 12 13 NSData *data = [NSJSONSerialization dataWithJSONObject:jsonObj options:nil error:nil]; 14 [data writeToFile:@"/Users/tengfei/Desktop/s.json" atomically:true]; 15 }
2.2.2 以Stream为中介
与NSData转换中介不同,通过Stream转换它是通过两种不同的对象进行。当进行JSON文件解析时,是通过NSInputStream;而当进行编码时,是通过NSOutputStream进行。
如下表是两种Stream的创建方法:
类名 |
创建Stream方法 |
NSInputStream |
+ (instancetype)inputStreamWithData:(NSData *)data |
+ (instancetype)inputStreamWithFileAtPath:(NSString *)path |
|
+ (instancetype)inputStreamWithURL:(NSURL *)url |
|
- (instancetype)initWithData:(NSData *)data |
|
- (instancetype)initWithFileAtPath:(NSString *)path |
|
- (instancetype)initWithURL:(NSURL *)url |
|
NSOutputStream |
+ (instancetype)outputStreamToMemory |
+ (instancetype)outputStreamToFileAtPath:(NSString *)path append:(BOOL)shouldAppend |
|
+ (instancetype)outputStreamWithURL:(NSURL *)url append:(BOOL)shouldAppend |
|
- (instancetype)initToMemory |
|
- (instancetype)initToFileAtPath:(NSString *)path append:(BOOL)shouldAppend |
|
- (instancetype)initWithURL:(NSURL *)url append:(BOOL)shouldAppend |
如下是通过Stream进行JSON文件的编码和解码的简单示例:
1 -(void) testJsonWithStream 2 { 3 NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; //获取文件的NSString路径 4 5 NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath:path]; //创建Stream对象 6 [inputStream open]; //打开Stream对象 7 8 id jsonObj = [NSJSONSerialization JSONObjectWithStream:inputStream options:NSJSONReadingMutableLeaves error:nil]; 9 10 NSInteger id = [jsonObj objectForKey:@"ResultCode"]; 11 NSLog(@"%@",[jsonObj objectForKey:@"ResultCode"]); 12 13 //创建输出流 14 NSOutputStream *outpuStream = [[NSOutputStream alloc] initToFileAtPath:@"/Users/tengfei/Desktop/s.json" append:true]; 15 [outpuStream open]; //打开Stream对象 16 [NSJSONSerialization writeJSONObject:jsonObj toStream:outpuStream options:0 error:nil]; 17 }
iOS 网络编程:JSON解析的更多相关文章
- iOS网络编程模型
iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...
- IOS网络编程——第三方类库
IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他
- IOS网络编程:HTTP
IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...
- iOS网络编程笔记——Socket编程
一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...
- iOS网络编程解析协议三:JSON数据传输解析
作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...
- iOS网络交互数据格式解析之json
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式.从ios5开 始,apple提供了对json的原生支持,但为了兼容以前的ios版本,我们仍然需要使用第三方库来解析常用 ...
- iOS网络-02-数据解析(JSON与XML)
数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...
- ios网络编程学习
//网络访问获取数据//定义一个UIWebView属性,用来展示数据 @property (strong, nonatomic) IBOutlet UIWebView *myWebView; //.. ...
随机推荐
- GTK+布局管理
GTK+布局管理 GTK+ 布局管理 在本章中,我们将讲述如何将构件布置在窗口与对话框中. 当我们在设计应用程序的图形界面时,我们首先要决定的是在程序中用到哪种构件和管理应用程序中的这些构件.为了方便 ...
- VBScript Sample:遍历文件夹并获取XML文件中指定内容
案例: 我有一个文件夹,里面有很多子文件夹,每个子文件夹中都存在一个相同名字的XML文件,XML文件里面的标签结构相同,只是内容不同,XML文件中包含ID,Name等标签. 文件夹及文件结构如下图: ...
- Jquery UI的datepicker插件使用方法
原文链接;http://www.ido321.com/375.html Jquery UI是一个非常丰富的Jquery插件,并且UI的各部分插件可以独自分离出来使用,这是其他很多Jquery插件没有的 ...
- Jquery+bootstrap实现静态博客主题
来源:个人博客 body部分: side部分: 文章页面: 下载链接: Fork Git: https://github.com/dwqs/theme1 ...
- git和repo入门
版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...
- Tcp服务端判断客户端是否断开连接
今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链 ...
- 自己安装的几个Eclipse插件
http://eclipsenotepad.sourceforge.net This plugin has the simple objective to let developers write s ...
- CentOS 6.5 安装配置VSFTP
1.下载安装VSFTP 首先查看当前系统是否已经安装VSFTP,若未安装则使用yum安装. chkconfig --list | grep vsftpd #查看是否安装 yum install vsf ...
- ORM存储过程和实体类代码生成工具
ORM存储过程和实体类生成工具 自己写的一个ORM框架的存储过程和实体类生成工具,具体界面如下: 操作步骤: 1.设置数据库连接: 2.选择要生成的表或视图: 3.选择要生成的存储过程类型: 4.如果 ...
- Delphi给窗体镶边-为控件加边框,描边,改变边框颜色
PS:因为我现在用的电脑是WIN7 64位系统,所以没有实现功能,不知道XP是否可行. //1.定义方法 procedure WMNCPaint(var Msg : TWMNCPaint); mess ...