说明:
- 本文总结NSJSONSerialization和MJExtension框架基本用法
- Dome数据来源
- 文章演示Dome天气预报API接口来自k780:
http://www.k780.com/api/weather.future - Dome地址:
https://github.com/BigTortoise/WeatherDome
Question:什么是JSON
- JSON是一种轻量级的数据格式,一般用于数据交互
- 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
- JSON的格式很像OC中的字典和数组
{"name": "jack","age": 10}
{"names": ["jack","rose","jim"]}
- 标准JSON格式的注意点:key必须用双引号
- 在iOS中,JSON的常见解析方案有4种
- 第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
- 苹果原生(自带):NSJSONSerialization(性能最好,iOS 5.0之后发布,现在主流的JSON解析方法)
JSON转换为OC数据类型
要想从JSON中挖掘出具体数据,得对JSON进行解析
JSON | OC |
---|---|
大括号{} | NSDictionary @{} |
中括号[] | NSArray @[] |
双引号"" | NSString @"" |
数字10、10.8 | NSNumber @10、@10.8 |
true | NSNumber @1 |
false | NSNumber @0 |
null | NSNull |
返回参数说明
返回示例(Json)
NSJSONSerialization的常见方法
- JSON数据 OC对象
+(id)JSONObjectWithData:(NSData*)data options:(NSJSONReadingOptions)opterror:(NSError**)error;
- OC对象 JSON数据
+(NSData*)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError**)error;
Dome代码演示
// 设置请求路径
NSURL *url = [NSURL URLWithString:@"http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"];
// 创建请求对象
NSURLRequest *reuqest = [[NSURLRequest alloc] initWithURL:url];
// 用NSURLConnection发送异步GET请求
[NSURLConnection sendAsynchronousRequest:reuqest queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError)
{
// 解析JSON
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@", dict);
}];
-
运行结果:
- 注意点:
- 如果没有特殊要求NSJSONSerialization方法中的options选kNilOptions
- NSJSONReadingOptions
- NSJSONReadingMutableContainers = (1UL << 0)
- 创建出来的数组和字典就是可变
- NSJSONReadingMutableLeaves = (1UL << 1)
- 数组或者字典里面的字符串是可变的
- NSJSONReadingAllowFragments
- 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber
- NSJSONReadingMutableContainers = (1UL << 0)
面向模型开发
MJExtension框架
应用场景:
[ 字典1,
字典2,
字典3 ]
如果每个字典都是一个模型,可以用
NSArray *modelArray = [模型类名 objectArrayWithKeyValuesArray:字段数组];