您好,登錄后才能下訂單哦!
Json數據解析后分類思路
代碼下載地址: "大字典 2.zip"
http://vdisk.weibo.com/s/HzjOj
我們這里已從新浪微博中請求回來的數據作為例子。為了讓工程簡化,我將數據寫入到本地了。這里主要是為了學習如何將Json數據解析分類。
新浪微博請求返回來的數據大致格式如下:
{ "statuses": [ { "created_at": "Tue May 31 17:46:55 +0800 2011", "id": 11488058246, "text": "求關注。", "source": "<a rel="nofollow">新浪微博</a>", "favorited": false, "truncated": false, "in_reply_to_status_id": "", "in_reply_to_user_id": "", "in_reply_to_screen_name": "", "geo": null, "mid": "5612814510546515491", "reposts_count": 8, "comments_count": 9, "annotations": [], "user": { "id": 1404376560, "screen_name": "zaku", "name": "zaku", "province": "11", "city": "5", "location": "北京 朝陽區", "description": "人生五十年,乃如夢如幻;有生斯有死,壯士復何憾。", "url": "http://blog.sina.com.cn/zaku", "profile_p_w_picpath_url": "http://tp1.sinaimg.cn/1404376560/50/0/1", "domain": "zaku", "gender": "m", "followers_count": 1204, "friends_count": 447, "statuses_count": 2908, "favourites_count": 0, "created_at": "Fri Aug 28 00:00:00 +0800 2009", "following": false, "allow_all_act_msg": false, "remark": "", "geo_enabled": true, "verified": false, "allow_all_comment": true, "avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1", "verified_reason": "", "follow_me": false, "online_status": 0, "bi_followers_count": 215 } }, ... ], "previous_cursor": 0, // 暫未支持 "next_cursor": 11488013766, // 暫未支持 "total_number": 81655 }
以上的示例來自新浪微博官網。我標出的紅色字體 ,是我們JSon解析分類的依據,他們都是字典,也就是說JSon解析分類的思路是按照字典去新建類,類與類之間的嵌套關系和JSon數據的格式相同,這我JSon解析的方法。
我來看一下代碼如何實現的:
新建User類用來存放user字典中的內容。
.h文件如下:
#import <Foundation/Foundation.h> @interface User : NSObject @property (strong, nonatomic) NSString* screen_name; -(User*)initWithJsonDictionary:(NSDictionary*)dic; +(User*)UserWithJsonDictionary:(NSDictionary*)dic; @end
.m文件如下:
@implementation User -(User*)initWithJsonDictionary:(NSDictionary *)dic { if (self = [super init]) { self.screen_name = [dic objectForKey:@"screen_name"]; } return self; } +(User*)UserWithJsonDictionary:(NSDictionary *)dic { //用這個類方法進行初始化的時候,都會alloc一次,因此就會新分配一塊空間 return [[User alloc] initWithJsonDictionary:dic]; }
新建Status類用來存放statuses字典中的內容。
.h文件如下:
#import <Foundation/Foundation.h> #import "User.h" @interface Status : NSObject @property (strong, nonatomic) NSString* userID; //將多個字典嵌套的數據取出的思路是為每一個字典對應的建一個數據模型的類 //例如:User類 @property (strong , nonatomic) User* user; -(Status*)initWithJsonDictionary:(NSDictionary*)dic; +(Status*)statusWithJsonDictionary:(NSDictionary*)dic; @end
.m文件如下:
@implementation Status -(Status*)initWithJsonDictionary:(NSDictionary *)dic { if (self = [super init]) { self.userID = [dic objectForKey:@"idstr"]; NSDictionary* userDic = [dic objectForKey:@"user"]; if (userDic) { self.user = [User UserWithJsonDictionary:userDic]; } } return self; } +(Status*)statusWithJsonDictionary:(NSDictionary *)dic { //用這個類方法進行初始化的時候,都會alloc一次,因此就會新分配一塊空間 return [[Status alloc] initWithJsonDictionary:dic]; }
為了模擬在真實項目中,獲得數據的類和顯示數據的類不在一個類中
我們新建一個試圖控制器用來顯示數據,我們顯示數據的位置是在控制臺。
OtherViewController.h代碼如下:
#import <UIKit/UIKit.h> @interface OtherViewController : UIViewController @property (strong , nonatomic) NSArray* statusArr; @end
OtherViewController.m代碼實現如下:
//用來接收通過消息機制發送來的數據 -(void)getArray:(NSNotification*)aNotification { self.statusArr = aNotification.object; }
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //添加一個按鈕點擊顯示數據 UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(30, 30, 30, 30); [self.view addSubview:btn]; [btn addTarget:self action:@selector(displayUserInfo) forControlEvents:UIControlEventTouchUpInside]; }
-(void)displayUserInfo { Status* status = [self.statusArr objectAtIndex:0]; NSLog(@"status.userID = %@",status.userID); NSLog(@"status.user.screen_name = %@",status.user.screen_name); }
最后,我們來看一下最后的一個類,我們從這個類中獲取數據,獲取數據的本地文件在代碼例子中。
ViewController.h代碼如下:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController -(IBAction)changeVC:(id)sender; @end
ViewController.m文件的代碼實現如下:
需要在Xib中拖一個Button與下面的方法相關聯
-(IBAction)changeVC:(id)sender { //將JSON格式的數據文件的路徑找出 NSString* path = [[NSBundle mainBundle] pathForResource:@"jsonTest" ofType:@"json"]; //將數據放入NSData中 NSData* data = [NSData dataWithContentsOfFile:path]; //JSON解析 NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; // NSLog(@"dic = %@",dic); NSArray* arr = [dic objectForKey:@"statuses"]; NSLog(@"%d",arr.count); NSLog(@"arr = %@",arr); //初始化一個數組 NSMutableArray* tempArr = [NSMutableArray array]; //將數組中的字典放入Status模型中,大家在這里會有一個疑問將數組中的字典都放入模型中,怎么區分不同數組中的數據? for (NSDictionary* item in arr) { //答案在statusWithJsonDictionary:的類方法中見該方法注釋 Status* status = [Status statusWithJsonDictionary:item]; NSLog(@"item = %@ ",item); //將Status類型的對象放入數組中 [tempArr addObject:status]; } //將tempArr數組通過消息中心發送到@"getArray" 這個名字的消息對應的方法中 [[NSNotificationCenter defaultCenter] postNotificationName:@"getArray" object:tempArr]; //切換視圖控制器 [[NSNotificationCenter defaultCenter] postNotificationName:@"changeVC" object:nil]; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。