一、什么是JSON数据?
1.
JSON:是一种轻量级的传输数据格式,用于数据交互。
JSON 是 javascript 语言的一个子集。
javascript 是个脚本语言(不需要编译),用来给HTML增加动态功能,javascript和java没有半毛钱的关系!
服务器返回给客户端的数据,一般都是 JSON 格式或者 XML 格式(文件下载除外)。
2.
语法规则:
<1> 数据以键值的方式保存;
键(key)必须用双引号("key"),与键值之间以':'分隔; {"name":"花无缺"}
<2> 数据和数据之间以逗号(,)分隔. {"name":"花无缺","age":13}
<3> {}表示对象. "person":{"name":"花无缺","age":13}
<4> []表示数组. "persons":[
{"name":"花无缺","age":13},
{"name":"小鱼儿","age":14},
{"name":"邀月","age":15}
]
3.
JSON与OC转换对照:
大括号 {} == NSDictionary;
中括号 [] == NSArray;
双引号 " " == NSString;
数字 13,13.5 == NSNumber;
4.
数据传输过程:
客户端发送请求给服务器,服务器接收到客户端的请求之后,返回给客户端JSON数据;客户端需要把服务器返回的JSON数据转换为OC的数据格式(数组/字典等)。
二、JSON数据解析
1.JSON解析方法:
使用第三方框架和苹果原生JSON解析器。
在iOS中,常见的JSON数据解析方案有4种:
第三方框架:JSONKit, SBJson【最流行】, TouchJson.性能从左到右,依次变差(iOS 5(2011年)以前)。
苹果原生(自带):NSJSONSerialization (性能是最好的,iOS5以后推出)。
2.
解析JSON数据
<1> 反序列化(解析):
目的: JSON数据 --> OC对象,得到数据字典或者数据数组。
将从服务器接收到的JSON数据(二进制数据)转换成OC数据类型(NSArray,NSDictionary等)的过程。
好处: 简化程序的开发,方便后续的字典转模型.
方法:
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
<2> 序列化:
目的:OC对象 --> JSON数据,得到二进制JSON数据 NSData。
将数组或者字典发送给服务器之前,转换成二进制数据。
好处:方便网络传输,提高传输速度。
方法:
+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
需要注意的是,在做序列化之前,一定使用 isValidJSONObject 检测一下要序列化的对象,是否能够正确被序列化,避免出现闪退!
JSON解析示例如下:
// JSON的序列化
NSDictionary *dict1 = @{@"name":@"花无缺",@"10":@19,@"height":@"180"};
NSDictionary *dict2 =@{@"person":dict1};
NSArray *array = @[@"zhangsan",@"小鱼儿",@"wangwu",dict2];
BOOL is_YES = [NSJSONSerialization isValidJSONObject:array];
if (is_YES) {
NSData *arrayJson = [NSJSONSerialization dataWithJSONObject:array options:0 error:NULL];
[arrayJson writeToFile:@"/Users/zhanghongyu/Desktop/task2" atomically:YES];
}
// JSON的反序列化
NSArray *dataArray = [NSJSONSerialization JSONObjectWithData:arrayJson options:0 error:nil];
NSLog(@"%@",dataArray);