@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解析的更多相关文章

  1. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  2. IOS网络编程——第三方类库

    IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他

  3. IOS网络编程:HTTP

    IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...

  4. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  5. iOS网络编程解析协议三:JSON数据传输解析

    作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...

  6. iOS网络交互数据格式解析之json

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式.从ios5开 始,apple提供了对json的原生支持,但为了兼容以前的ios版本,我们仍然需要使用第三方库来解析常用 ...

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

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

  8. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

  9. ios网络编程学习

    //网络访问获取数据//定义一个UIWebView属性,用来展示数据 @property (strong, nonatomic) IBOutlet UIWebView *myWebView; //.. ...

随机推荐

  1. NetCat简介与使用方法

    精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...

  2. “菜单”(menubar)和“工具栏”(toolbars)

    "菜单"(menubar)和"工具栏"(toolbars) "菜单" (menubar)和"工具栏"(toolbars) ...

  3. Magento输入正确的登陆名和密码无法进入后台

    请找到 这个文件夹: app\code\core\Mage\Core\Model\Session\Abstract 然后修改Varien.php这个文件: 找到代码(大约88行): $cookiePa ...

  4. mvc5 HTML Helper

    转自:http://www.cnblogs.com/CodeFox/p/3782535.html 提及到HTML helper大家肯定不应该陌生, 因为在书写MVC View的时候肯定需要使用到它.一 ...

  5. 5个经典的JavaScript面试基础问题

    JavaScript程序员在IT领域中的需求量非常巨大.如果你非常精通JavaScript,你会有很多换工作.涨薪水的机会.但是在一家公司录用你之前,你必须顺利通过面试,证明你的技能.在本文中,我将向 ...

  6. Android实例-如何使用系统剪切板(XE8+小米2)

    结果: 发现个问题,就是粘贴时会清除之前的信息. unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, S ...

  7. void类型及void指针

    1.概述 许多初学者对C/C 语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2 ...

  8. 简单OS(ucos超级精简版)——裸调度器【worldsing笔记】

    简单原则少ROM,少RAM,任务完成就让出CPU,调度器描述: 1.按最大任务数轮番调度: 2.任务调用延时接口将让出CPU使用权,进入下一个任务调度: 3.用户任务都处于延时或是不使用CPU运行Id ...

  9. 3.x的触摸响应机制

    第一种是采用函数回调,主要是用于MenuItem [cpp] view plaincopy // a selector callback void menuCloseCallback(Object*  ...

  10. 【UML】——为什么要使用UML

    以前一提到UML,就想到了复杂的流程图.很敬佩哪些想想就能画出整个系统的UML图的人,因为他们头脑中有整个软件架构的蓝图,这样在编写实现的时候,就会知道哪个地方改怎么做,哪个地方如何扩展. 而想成为架 ...