JSON 简介
JavaScript Object Notation
(JavaScript
的对象表示法).- JSON 本质上,就是一个"特殊格式"的字符串.
- JSON 是网络上用来传输数据使用最广泛的数据格式,没有之一.
JSON
比XML
更轻量级. - JSON 出身草根,是
Javascript
的子集,专门负责描述数据的一种格式. Javascript
是做网页开发使用的一种"脚本"语言.Javascript
&Java
没有任何关系!- 参考网站:http://www.w3cschool.cc
- JSON具有自我描述性,更易理解.
JSON 语法规则
- 数据以 key/value 值对表示
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
- 提示 : JSON描述对象的语法格式很像字典.但是,不是字典,仅仅是键值对的形式很像.
1
2
|
{} 对象 {
"key"
:
"value"
,
"name"
:
"zhangjie"
}
[] 数组 [{},{}]
|
JSON 值
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null (空值)
JSON描述对象
-
新建工程,新建文件
demo.json
-
描述一个学生
{ "name":"赏金猎人", "age":"18" } // 描述一个另学生 { "name":"莫甘娜", "age":19 } - 描述多个学生 [ { "name":"金克斯", "age":"18" }, { "name":"武器大师", "age":"19" }, { "name":"邪恶小法师", "age":"20" } ]
JSON解析_NSJSONSerialization
- 问什么要解析JSON数据?
- 因为从服务器获取到的JSON数据都是二进制的,客户端无法直接使用,就需要将二进制的JSON数据转换成客户端可以直接使用的OC对象.
- 注意 : JSON形式的字符串客户端也无法直接使用.还是需要将其转换成OC对象.
序列化 & 反序列化
- 序列化: 在向服务器发送数据之前,将
NSArry
/NSDictionary
等OC对象
转换成二进制的过程. - 反序列化: 在从服务器接收到数据之后,将二进制数据转换成
NSArray
/NSDictionary
等OC对象
的过程. - JSON解析也叫做JSON反序列化
JSON解析 & JSON反序列化
- 加载
demo.json
文件中的JSON数据
- (void)loadJSON { // 获取请求 NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/demo.json"]; // 创建请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 发送异步请求,获取JSON数据 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 判断链接是否出错 if (connectionError) { NSLog(@"链接出错"); return; } // 判断响应是否出错 NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response; if (HTTPURLResponse.statusCode == 200 || HTTPURLResponse.statusCode == 304) { // data : 二进制,本质是JSON字符串 // JSON序列化 : 将对象序列化成JSON字符串 // JSON解析 : JSON反序列化,将二进制形式的JSON字符串转换成对象 // 保存解析错误时的信息 NSError *error; // 成功拿到数据,解析JSON id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; // 判断解析是否出错 if (error) { NSLog(@"解析出错 %@",error); return; } // 解析正确 NSLog(@"json类型 %@ json %@",[json class],json); } else { NSLog(@"服务器内部出错"); return; } }]; }
JSON解析 & JSON反序列化 的核心部分
// 保存解析错误时的信息 NSError *error; // 成功拿到数据,解析JSON id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; // 判断解析是否出错 if (error) { NSLog(@"解析出错 %@",error); return; } // 解析正确 NSLog(@"json类型 %@ json %@",[json class],json);
总结
- 打印
json
类型的结果是__NSCFDictionary
,表示字典. -
NSJSONSerialization
自动将二进制形式的JSON字符串
解析成了字典. -
JSON解析返回的对象是
字典
或数组
,是根据原始数据是由{}
或者[]
括起来决定的.
- 如果JSON数据中有中文,输出的是经过Unicode编码的内容,无法识别.
- 解析JSON最终的目的?
JSON解析_options
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
options参数说明
- NSJSONReadingOptions
选项 | 说明 |
---|---|
NSJSONReadingMutableContainers = (1UL << 0) | 容器可变 |
NSJSONReadingMutableLeaves = (1UL << 1) | 叶子可变 |
NSJSONReadingAllowFragments = (1UL << 2) | 顶级节点可以不是 NSArray 或者 NSDictionary,但必须是有效的JSON内容,比如字符串必须带引号 |
- 在实际开发中,获得网络的数组或者字典之后,通常会做字典转模型!反序列化的结果是否可变并不重要
选项选择
0
,表示任何附加操作都不做,效率最高!
NSJSONSerialization 类
- 专门负责在
JSON
和Foundation
对象直接转换的类 - 可以转换成
JSON
的Foundation
对象(即能够做JSON序列化的对象)需要具备以下条件:- 顶级节点是
NSArray
或者NSDictionary
- 所有的对象是
NSString
,NSNumber
,NSArray
,NSDictionary
或者NSNull
- 所有字典的
key
是NSString
NSNumber
不是空或者无穷大
- 顶级节点是
JSON解析_转模型
- 解析JSON最终的目的是字典转模型.
- NSJSONSerialization 解析完JSON之后.打印
json
类型的结果是__NSCFDictionary
,表示字典.
模型类声明
@interface MessageModel : NSObject @property (nonatomic,copy) NSString *messageId; @property (nonatomic,copy) NSString *message; /// 字典转模型的方法 + (instancetype)messageWithDict:(NSDictionary *)dict; @end
模型类实现
@implementation MessageModel /// 字典转模型 + (instancetype)messageWithDict:(NSDictionary *)dict { MessageModel *model = [[MessageModel alloc] init]; // KVC字典转模型 [model setValuesForKeysWithDictionary:dict]; return model; } /// 输出自定义对象 - (NSString *)description { return [NSString stringWithFormat:@"%@ {messageId:%@, message:%@}",[super description],self.messageId,self.message]; } @end
字典转模型
NSError *error; // 成功拿到数据,解析JSON // id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; // 解析出来的是字典对象 // NSLog(@"json类型 %@ json %@",[json class],json); NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (error) { NSLog(@"解析出错 %@",error); return; } // 字典转模型 MessageModel *model = [MessageModel messageWithDict:jsonDict]; NSLog(@"%@",model);
常见的 JSON 解析第三方框架
- JSONKit(最快)
- SBJson
- TouchJSON
- 说明 : 以上三个框架的性能依次降低!