JSON 介绍
JSON 本质上,就是一个"特殊格式"的字符串
JSON 是网络上用来传输数据使用最广泛的数据格式,没有之一
JSON 出身草根,是
Javascript
的子集,专门负责描述数据格式Javascript
是做网页开发使用的一种"脚本"语言Javascript
&Java
没有任何关系!
JSON 语法规则
数据以
key/value
值对表示数据由逗号分隔
花括号保存对象
方括号保存数组
JSON 值
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(
true
或false
)数组(在方括号中)
对象(在花括号中)
null
序列化 & 反序列化
序列化:在向服务器发送数据之前,将
NSArray
/NSDictionary
转换成二进制的过程反序列化:在从服务器接收到数据之后,将二进制数据转换成
NSArray
/NSDictionary
的过程
JSON 反序列化
天气预报接口
NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/adat/sk/101010100.html"];
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];NSLog(@"%@ %@", result, [result class]);
选项 | 说明 |
---|---|
NSJSONReadingMutableContainers = (1UL << 0) | 容器可变 |
NSJSONReadingMutableLeaves = (1UL << 1) | 叶子可变 |
NSJSONReadingAllowFragments = (1UL << 2) | 顶级节点可以不是 NSArray 或者 NSDictionary |
在实际开发中,获得网络的数组或者字典之后,通常会做字典转模型!反序列化的结果是否可变并不重要
选项选择
0
,表示任何附加操作都不做,效率最高!
NSJSONSerialization 类
专门负责在
JSON
和Foundation
对象直接转换的类可以转换成
JSON
的Foundation
对象需要具备以下条件:顶级节点是
NSArray
或者NSDictionary
所有的对象是
NSString
,NSNumber
,NSArray
,NSDictionary
或者NSNull
所有字典的
key
是NSString
NSNumber
不是空或者无穷大
JSON 解析第三方框架
常见的 JSON 解析第三方框架
JSONKit
(最快)SBJson
TouchJSON
以上三个框架的性能依次降低!
介绍 JSONKit 第三方框架的目的
JSON
的解析并不是表面上那么简单官方说
JSONKit
比苹果原生的JSON
解析速度快!JSONKit
在很多老的项目中仍然在使用
知道
JSONKit
说明我们是 iOS 程序
JSONKit
适用于 iOS 5.0 以前的版本开发使用
了解 ARC & MRC
混编的方法
步骤
下载框架 https://github.com/johnezang/JSONKit
导入框架文件
JSONKit.h
JSONKit.m
设置 MRC 标记
可以告诉编译器,编译 JSONKit.m 时不使用 ARC
选择"项目"-"Build Phases"-"Compile Sources"
找到 JSONKit.m 并且在 Compiler Flags 中添加
-fno-objc-arc
修改错误
利用自动修复功能,修改两处 isa 的错误
反序列化
id result = [[JSONDecoder decoder] objectWithData:data];
性能测试
static int largeNumber = 100 * 1000;
- (void)jsonKitDemo { NSString *urlString = @"http://localhost/demo.json";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString]; NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSLog(@"start");
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); for (int i = 0; i < largeNumber; ++i) { id result = [[JSONDecoder decoder] objectWithData:data];
} NSLog(@"%f", CFAbsoluteTimeGetCurrent() - start); // 数据处理代码...
}];
}
测试结果:
时间:3.24s
内存:4.74G
苹果原生框架
时间:0.18s
内存:几乎不变
重要提示:进入公司,如果仍然还在使用老的框架解析 JSON
,可以直接替换成苹果原生的解析