說明:
- 本文總結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 |
返回參數說明
返回參數說明.png
返回示例(Json)
返回示例(Json).png
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);
}];
-
運行結果:
運行結果.png - 注意點:
- 如果沒有特殊要求NSJSONSerialization方法中的options選kNilOptions
- NSJSONReadingOptions
- NSJSONReadingMutableContainers = (1UL << 0)
- 創建出來的數組和字典就是可變
- NSJSONReadingMutableLeaves = (1UL << 1)
- 數組或者字典里面的字符串是可變的
- NSJSONReadingAllowFragments
- 允許解析出來的對象不是字典或者數組,比如直接是字符串或者NSNumber
- NSJSONReadingMutableContainers = (1UL << 0)
面向模型開發
MJExtension框架
應用場景:
[ 字典1,
字典2,
字典3 ]
如果每個字典都是一個模型,可以用
NSArray *modelArray = [模型類名 objectArrayWithKeyValuesArray:字段數組];