说一下 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.youkuaiyun.com/detail/abc13939746593/5226247
SBJson 库的 下载地址:http://download.youkuaiyun.com/detail/abc13939746593/5226267
JsonKit 库的 下载地址:http://download.youkuaiyun.com/detail/abc13939746593/5226265
TouchJson 库的 下载地址:http://download.youkuaiyun.com/detail/abc13939746593/5226258
参考下面的文章做的:
http://blog.youkuaiyun.com/enuola/article/details/7903632
不过这位大神的文章写的有点乱了,给的链接都是同一个文件