- <h5>JSON</h5>
- 什么是JSON
- JSON是一种轻量级的数据格式,一般用于数据交互
- 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
- JSON的格式很像OC中的字典和数组
{"name" : "Vincent", "age" : 10}
{"names" : ["Vincent", "Eli", "Ives"]} - 标准JSON格式的注意点:
key必须用双引号
- 要想从JSON中挖掘出具体数据,得对JSON进行解析
-JSON
转换为OC数据类型
- 什么是JSON
<h5>JSON–OC转换对照表</h5>
JSON | OC |
---|---|
大括号{ } | NSDictionary |
中括号[ ] | NSArray |
双引号" " | NSString |
数字10、10.8 | NSNumber |
- <h5>JSON解析方案</h5>
- 在iOS中,JSON的常见解析方案有四种
- 第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
- 苹果原生,序列化工具(自带):NSJSONSerialization(
性能最好
)
- NSJSONSerialization的常见方法
- JSON数据 --> OC对象(反序列化)
+(id)JSONObjectWithData:(NSData)data options:(NSJSONReadingOptions)opterror:(NSError*)error; - OC对象 --> JSON数据(序列化)
+(NSData)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError*)error;
- JSON数据 --> OC对象(反序列化)
- 在iOS中,JSON的常见解析方案有四种
<b>序列化/反序列化在代码中的应用</b>
- 反序列化
- (void)deserialization { // JSON --> OC对象(反系列化)
// 01.确定请求路径
NSURL *url = [NSURL URLWithString:@""];
// 02.创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 03.发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//data --> 本质上是一个json字符串
// 04.解析数据
/**
JSON --> OC对象 反序列化
@param NSData JSON的二进制数据
@param NSJSONReadingOptions 位移枚举
@param NSError 错误信息
@return NSDictionary
*/
/**
NSJSONReadingMutableContainers = (1UL << 0), // 可变字典或数组
NSJSONReadingMutableLeaves = (1UL << 1), // 内部所有的字符串都是可变的,注意iOS7之后有问题,一般不用
NSJSONReadingAllowFragments = (1UL << 2) // 既不是字典也不是数组,则必须使用该枚举值(一般用此枚举值)
*/
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@", dic[@"error"]);
//枚举值:NSJSONReadingAllowFragments使用
NSString *strM = @"\"By_Vincent\"";
id obj = [NSJSONSerialization JSONObjectWithData:strM options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@------%@---", [obj class], obj);
}];
}
- 序列化
- (void)serialization { //OC对象 --> JSON对象(序列化)
NSDictionary *dictM = @{
@"name":@"Vincent",
@"age":@"24"
};
NSArray *arrayM = @[@"123", @"456"];
//注意:并不是所有的OC对象都能转换成JSON对象的
/**
- Top level object is an NSArray or NSDictionary //最外层必须是字典或者是数组
- All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull //所有的元素必须是字符串,数字,数组,字典或者NSNull类型
- All dictionary keys are NSStrings //所有字典中的key必须是字符串类型
- NSNumbers are not NaN or infinity //数字类型必须是正确的数字,不能是无穷大
*/
BOOL isValid = [NSJSONSerialization isValidJSONObject:dictM];
if (!isValid) {
NSLog(@"%zd", isValid);
return;
}
/**
// OC --> JSON
@param id 要转化的OC对象
@param NSJSONWritingOptions 选项:NSJSONWritingPrettyPrinted,自动排版 美观
@param NSError 错误信息
@return NSData
*/
NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}