您的位置:首页 > 移动开发 > IOS开发

ios学习笔记(三)-----json数据的解析

2013-04-06 15:41 573 查看
说一下 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

不过这位大神的文章写的有点乱了,给的链接都是同一个文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: