一、什么是JSON



JSON是一种轻量级的数据格式,一般用于数据交互



服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)



 



JSON的格式很像OC中的字典和数组



{ 
  "name" 
    
  :  
  "jack" 
  ,  
  "age" 
    
  : 10} 
 
 
 
 
  { 
  "names" 
    
  : [ 
  "jack" 
  ,  
  "rose" 
  ,  
  "jim" 
  ]}



标准JSON格式的注意点:key必须用双引号



 



要想从JSON中挖掘出具体数据,得对JSON进行解析。即把JSON 转换为 OC数据类型



 



二、JSON – OC 转换对照表



对照关系



 



三、JSON解析方案



1.在iOS中,JSON的常见解析方案有4种



(1)第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差) 



(2)苹果原生(自带):NSJSONSerialization(性能最好)



 



2.NSJSONSerialization的常见方法



(1)JSON数据 ——》 OC对象



+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;



 



(2)OC对象 ——》 JSON数据 



+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;



3.解析来自服务器的JSON示意图



四、部分代码示例



#import "YYViewController.h" 
  #import "MBProgressHUD+MJ.h" 
  @interface YYViewController () 
  @property (weak, nonatomic) IBOutlet UITextField *username; 
  - (IBAction)login; 
  @end 
  @implementation YYViewController 
  - (IBAction)login { 
  //    1.提前的表单验证  
  if   
  (self.username.text.length==0) { 
  [MBProgressHUD showError:@ 
  "请输入用户名" 
  ];    
  return  
  } 
  if    
  (self.pwd.text.length==0) {  
  [MBProgressHUD showError:@ 
  "请输入密码" 
  ]; 
  return 
  ;  
  } 
  //    2.发送请求给服务器(带上账号和密码) 
  //添加一个遮罩,禁止用户操作 
  [MBProgressHUD showMessage:@ 
  "正在努力加载中...." 
  ]; 
  // 
  //    1.设置请求路径 
  //    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; 
  //    NSURL *url=[NSURL URLWithString:urlStr]; 
  // 1.设置请求路径  
  NSURL *URL=[NSURL URLWithString:@ 
  "http://192.168.1.53:8080/MJServer/login" 
  ];//不需要传递参数 
  //    2.创建请求对象 
  NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL]; 
  //默认为get请求 
  request.timeoutInterval=5.0; 
  //设置请求超时为5秒 
  request.HTTPMethod=@ 
  "POST" 
  ; 
  //设置请求方法  
   
  //把拼接后的字符串转换为data,设置请求体 
  request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding]; 
   
  //客户端类型,只能写英文 
  [request setValue:@ 
  "ios+android" 
    
  forHTTPHeaderField:@ 
  "User-Agent" 
  ]; 
 
  //    3.发送请求 
//获取一个主队列    
  NSOperationQueue *queue=[NSOperationQueue mainQueue];  
  [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
  //当请求结束的时候调用(有两种结果,一个是成功拿到数据,也可能没有拿到数据,请求失败) 
  [MBProgressHUD hideHUD]; 
  if 
    
  (data) { 
  //请求成功 
  NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];  
   
  //判断后,在界面提示登录信息   
  NSString *error=dict[@ 
  "error" 
  ];   
  if 
    
  (error) { 
   
  [MBProgressHUD showError:error]; 
   
  } 
  else 
  
  {    
  NSString *success=dict[@ 
  "success" 
  ];   
  [MBProgressHUD showSuccess:success]; 
  }  
  } 
  else 
      
  //请求失败   
  { 
   
  [MBProgressHUD showError:@ 
  "网络繁忙,请稍后重试!" 
  ]; 
  }  
   
  }]; 
   
  NSLog(@ 
  "请求发送完毕" 
  ); 
 
  } 
  @end