iOS·HTTP那点事(2)JSON数据解析

说明:

  • 本文总结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

返回参数说明

iOS·HTTP那点事(2)JSON数据解析_第1张图片
返回参数说明.png

返回示例(Json)

iOS·HTTP那点事(2)JSON数据解析_第2张图片
返回示例(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);
     }];
  • 运行结果:


    iOS·HTTP那点事(2)JSON数据解析_第3张图片
    运行结果.png
  • 注意点:
  • 如果没有特殊要求NSJSONSerialization方法中的options选kNilOptions
  • NSJSONReadingOptions
    • NSJSONReadingMutableContainers = (1UL << 0)
      • 创建出来的数组和字典就是可变
    • NSJSONReadingMutableLeaves = (1UL << 1)
      • 数组或者字典里面的字符串是可变的
    • NSJSONReadingAllowFragments
      • 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber

面向模型开发

MJExtension框架
应用场景:

[ 字典1,
 字典2,
 字典3 ]

如果每个字典都是一个模型,可以用

NSArray *modelArray = [模型类名 objectArrayWithKeyValuesArray:字段数组];

你可能感兴趣的:(iOS·HTTP那点事(2)JSON数据解析)