如何parsing与Objective-C的JSON?
我是iPhone新手。 任何人都可以告诉我要遵循的步骤来parsing这些数据并获取活动的详细信息,名字和姓氏吗?
{ "#error": false, "#data": { "": { "activity_id": "35336", "user_id": "1", "user_first_name": "Chandra Bhusan", "user_last_name": "Pandey", "time": "1300870420", "activity_details": "Good\n", "activity_type": "status_update", "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-1627435117.jpg" }, "boolean": "1", "1": { "1": { "photo_1_id": "9755" }, "activity_id": "35294", "album_name": "Kalai_new_Gallery", "user_id": "31", "album_id": "9754", "user_first_name": "Kalaiyarasan", "user_last_name": "Balu", "0": { "photo_0_id": "9756" }, "time": "1300365758", "activity_type": "photo_upload", "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/" }, "3": { "activity_id": "35289", "user_id": "33", "user_first_name": "Girija", "user_last_name": "S", "time": "1300279636", "activity_details": "girija Again\n", "activity_type": "status_update", "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg" }, "2": { "owner_first_name": "Girija", "activity_id": "35290", "activity_details": "a:2:{s:4:\"html\";s:51:\"!user_fullname and !friend_fullname are now friends\";s:4:\"type\";s:10:\"friend_add\";}", "activity_type": "friend accept", "owner_last_name": "S", "time": "1300280400", "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg", "owner_id": "33" }, "4": { "activity_id": "35288", "user_id": "33", "user_first_name": "Girija", "user_last_name": "S", "time": "1300279530", "activity_details": "girija from mobile\n", "activity_type": "status_update", "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg" } } }
从OS X v10.7和iOS 5发布的angular度来看,可能现在推荐的第一件事是NSJSONSerialization
,苹果公司提供的JSONparsing器。 如果在运行时发现该类不可用,请仅将第三方选项用作后备。
所以,例如:
NSData *returnedData = ...JSON data, probably from a web request... // probably check here that returnedData isn't nil; attempting // NSJSONSerialization with nil data raises an exception, and who // knows how your third-party library intends to react? if(NSClassFromString(@"NSJSONSerialization")) { NSError *error = nil; id object = [NSJSONSerialization JSONObjectWithData:returnedData options:0 error:&error]; if(error) { /* JSON was malformed, act appropriately here */ } // the originating poster wants to deal with dictionaries; // assuming you do too then something like this is the first // validation step: if([object isKindOfClass:[NSDictionary class]]) { NSDictionary *results = object; /* proceed with results as you like; the assignment to an explicit NSDictionary * is artificial step to get compile-time checking from here on down (and better autocompletion when editing). You could have just made object an NSDictionary * in the first place but stylistically you might prefer to keep the question of type open until it's confirmed */ } else { /* there's no guarantee that the outermost object in a JSON packet will be a dictionary; if we get here then it wasn't, so 'object' shouldn't be treated as an NSDictionary; probably you need to report a suitable error condition */ } } else { // the user is using iOS 4; we'll need to use a third-party solution. // If you don't intend to support iOS 4 then get rid of this entire // conditional and just jump straight to // NSError *error = nil; // [NSJSONSerialization JSONObjectWithData:... }
不要重新发明轮子。 使用json框架或类似的东西。
如果你决定使用json-framework,那么你将如何parsing一个JSONstring到NSDictionary
:
SBJsonParser* parser = [[[SBJsonParser alloc] init] autorelease]; // assuming jsonString is your JSON string... NSDictionary* myDict = [parser objectWithString:jsonString]; // now you can grab data out of the dictionary using objectForKey or another dictionary method
NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"json"]; //将文件内容读取到string中,注意编码NSUTF8StringEncoding 防止乱码, NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; //将string写到缓冲区。 NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *jsonError; id allKeys = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONWritingPrettyPrinted error:&jsonError]; for (int i=0; i<[allKeys count]; i++) { NSDictionary *arrayResult = [allKeys objectAtIndex:i]; NSLog(@"name=%@",[arrayResult objectForKey:@"storyboardName"]); }
文件:
[ { "ID":1, "idSort" : 0, "deleted":0, "storyboardName" : "MLMember", "dispalyTitle" : "76.360779", "rightLevel" : "10.010490", "showTabBar" : 1, "openWeb" : 0, "webUrl":"" }, { "ID":1, "idSort" : 0, "deleted":0, "storyboardName" : "0.00", "dispalyTitle" : "76.360779", "rightLevel" : "10.010490", "showTabBar" : 1, "openWeb" : 0, "webUrl":"" } ]
JSONparsing使用NSJSONSerialization
NSString* path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"]; //Here you can take JSON string from your URL ,I am using json file NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *jsonError; NSArray *jsonDataArray = [[NSArray alloc]init]; jsonDataArray = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError]; NSLog(@"jsonDataArray: %@",jsonDataArray); NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&jsonError]; if(jsonObject !=nil){ // NSString *errorCode=[NSMutableString stringWithFormat:@"%@",[jsonObject objectForKey:@"response"]]; if(![[jsonObject objectForKey:@"#data"] isEqual:@""]){ NSMutableArray *array=[jsonObject objectForKey:@"#data"]; // NSLog(@"array: %@",array); NSLog(@"array: %d",array.count); int k = 0; for(int z = 0; z<array.count;z++){ NSString *strfd = [NSString stringWithFormat:@"%d",k]; NSDictionary *dicr = jsonObject[@"#data"][strfd]; k=k+1; // NSLog(@"dicr: %@",dicr); NSLog(@"Firstname - Lastname : %@ - %@", [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_first_name"]], [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_last_name"]]); } } }
你可以看到Console输出如下:
名字 – 姓氏:钱德拉Bhusan – 潘迪
名 – 姓:Kalaiyarasan – Balu
名字 – 姓:(空) – (空)
名 – 姓:Girija – S
名 – 姓:Girija – S
名字 – 姓:(空) – (空)
- 我build议并使用TouchJSONparsingJSON。
-
回答你对Alex的评论。 这里是快速代码,应该允许您从返回的json字典中获取像activity_details,last_name等字段:
NSDictionary *userinfo=[jsondic valueforKey:@"#data"]; NSDictionary *user; NSInteger i = 0; NSString *skey; if(userinfo != nil){ for( i = 0; i < [userinfo count]; i++ ) { if(i) skey = [NSString stringWithFormat:@"%d",i]; else skey = @""; user = [userinfo objectForKey:skey]; NSLog(@"activity_details:%@",[user objectForKey:@"activity_details"]); NSLog(@"last_name:%@",[user objectForKey:@"last_name"]); NSLog(@"first_name:%@",[user objectForKey:@"first_name"]); NSLog(@"photo_url:%@",[user objectForKey:@"photo_url"]); } }
从iOS 5.0开始,您可以使用NSJSONSerialization将JSON数据parsing为本机types,如NSDictionary和NSArray。
资料来源:
http://applemacosx.com/2015/10/30/parse-json-with-objective-c/