说一下 ios中关于 json 数据解析的 总体思想: 由于ios中不像java中 可以将json 和 实体类相互转换(其实 可以的,网上有人实现,但是比较麻烦,而且不能适用所有的业务逻辑),暂且不管它,ios中解析json的总体思想是:将json看做 字典 处理,当然对于复杂的json,可以看做,外部是个字典,内部也是一个字典,嵌套使用,解析的时候,可以由外到内,一层层的剥开。比如外层的 一个key 对应的一个字典,那么 objectforkey:(key) 得到便是一个字典的对象,那么 可以对该对象继续 objectforkey:(key) 这样就又剥开了一层,以此内推。
按照的上文的做法,如图:
代码如下:
ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (retain, nonatomic) IBOutlet UITextView *txtView; - (IBAction)btnPressTouchJson:(id)sender; - (IBAction)btnPressSBJson:(id)sender; - (IBAction)btnPressIOS5Json:(id)sender; - (IBAction)btnPressJsonKit:(id)sender; @end
ViewController.m
#import "ViewController.h" #import "CJSONDeserializer.h" #import "SBJson.h" #import "JSONKit.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //使用TouchJson来解析北京的天气 - (IBAction)btnPressTouchJson:(id)sender { //获取API接口 NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"]; //定义一个NSError对象,用于捕获错误信息 NSError *error; NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; NSLog(@"jsonString--->%@",jsonString); //将解析得到的内容存放字典中,编码格式为UTF8,防止取值的时候发生乱码 NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error]; //因为返回的Json文件有两层,去第二层内容放到字典中去 NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"]; NSLog(@"weatherInfo--->%@",weatherInfo); //取值打印 _txtView.text = [NSString stringWithFormat:@"TouchJson解析--------》今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]; } //使用SBJson解析南阳的天气 - (IBAction)btnPressSBJson:(id)sender { NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101180701.html"]; NSError *error = nil; NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; SBJsonParser *parser = [[SBJsonParser alloc] init]; NSDictionary *rootDic = [parser objectWithString:jsonString error:&error]; NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"]; _txtView.text = [NSString stringWithFormat:@"SBJson解析--------》今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]; } //使用ios5中自带的方法解析 - (IBAction)btnPressIOS5Json:(id)sender { NSError *error; //加载一个NSURL对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"]]; //将请求的url数据放到NSData对象中 NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中 NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"]; _txtView.text = [NSString stringWithFormat:@"IOS5自带解析--------》今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]; NSLog(@"weatherInfo字典里面的内容为--》%@", weatherDic ); } //使用JsonKit解析 - (IBAction)btnPressJsonKit:(id)sender { NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101180701.html"]; NSError *error = nil; NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; NSDictionary *weatherDic=[jsonString objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode]; NSDictionary *weatherInfo=[weatherDic objectForKey:@"weatherinfo"]; _txtView.text = [NSString stringWithFormat:@"JsonKit解析--------》今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]; NSLog(@"weatherInfo字典里面的内容为--》%@", weatherDic ); } @end
完整的项目代码下载地址:http://download.csdn.net/detail/abc13939746593/5226247
SBJson 库的 下载地址:http://download.csdn.net/detail/abc13939746593/5226267
JsonKit 库的 下载地址:http://download.csdn.net/detail/abc13939746593/5226265
TouchJson 库的 下载地址:http://download.csdn.net/detail/abc13939746593/5226258
参考下面的文章做的:
http://blog.csdn.net/enuola/article/details/7903632
不过这位大神的文章写的有点乱了,给的链接都是同一个文件