如何使用带有 NSJSONSerialization 类参考的 xcode 4.3.1 从 URL 获取数据
Posted
技术标签:
【中文标题】如何使用带有 NSJSONSerialization 类参考的 xcode 4.3.1 从 URL 获取数据【英文标题】:How do I fetch data from URL, using xcode 4.3.1 with NSJSONSerialization Class Reference 【发布时间】:2012-03-17 19:59:57 【问题描述】:我正试图了解NSJSONSerialization Class Reference。在 developer.apple.com 网站上缺少代码示例,我迷路了。 网络上有数以百万计的示例以及其他 json 库,但我无法让它们中的任何一个与最新版本的 xcode 一起工作。 (我正在运行:版本 4.3.1 (4E1019) 并在 iPhone 5.0.1 上进行测试)
我想使用一个按钮将 json 文件中的数据提取到我的 iphone 中。
假设我从 URL 获取数据: http://companyurl/jsonfile.json(标准 JSON 格式)
jsonfile.json 看起来像这样……;
"companylist":
[
"company":"Companyname 1",
"telephone":"1234567890",
"url":"http:\/\/www.companyname1.com\/",
"category":"category 1",
"position":"1",
,
"company":"Companyname 2",
"telephone":"2345678901",
"url":"http:\/\/www.companyname2.com\/",
"category":"category 2",
"position":"2",
,
"company":"Companyname 3",
"telephone":"3456789012",
"url":"http:\/\/www.companyname3.com\/",
"category":"category 3",
"position":"3",
]
我在 .h 和 .m 文件中写什么?
感谢您的帮助! :)
【问题讨论】:
提问前先搜索有帮助:how to use NSJSONSerialization,retrieving data from url 【参考方案1】:NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://your_web_server/your_file...."]];
NSError *error=nil;
id response=[NSJSONSerialization JSONObjectWithData:data options:
NSJSONReadingMutableContainers error:&error];
NSLog(@"Your JSON Object: %@ Or Error is: %@", response, error);
注意:此代码目前适用于 Xcode 4.2,模拟器上的 ios 5.01 和 iPad 设备上的 5.1
【讨论】:
【参考方案2】:谢谢各位。我想到了。 (...这就是我所做的:)
在我的 .m 文件中,我添加了以下代码:
- (IBAction)getDataFromJson:(id)sender
NSURL *url = [NSURL URLWithString:@"http://yourwebsite.com/jsonfile.json"];
NSData *jsonData = [NSData dataWithContentsOfURL:url];
if(jsonData != nil)
NSError *error = nil;
id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
if (error == nil)
NSLog(@"%@", result);
在我的 .h 文件中,我添加了以下代码:
@interface ViewController : UIViewController
- (IBAction)getDataFromJson:(id)sender;
【讨论】:
【参考方案3】:这里有一个很棒的教程。 http://www.raywenderlich.com/5492/working-with-json-in-ios-5
【讨论】:
(我没有让这个工作......但我可能错过了一些东西。)【参考方案4】:永远不要使用 dataWithContentsOfURL: 以这种方式获取服务器数据。它是不可控的,可能会使您的应用程序处于未知状态。您至少应该使用 NSURLRequest 进行所有 url 调用。更好的是,如果您不支持 iOS7 之前的版本,请使用 NSURLSession。
【讨论】:
【参考方案5】:有一个Tweeting sample app形式的代码示例。
【讨论】:
【参考方案6】: jsonDict = [[NSDictionary alloc] init];
data = [[NSArray alloc] init];
url =[NSURLURLWithString:@"Please Type Your URL "];
// Parse the JSON data from the given URL
- (void) parseJSONWithURL:(NSURL *) jsonURL
// Set the queue to the background queue. We will run this on the background thread to keep
// the UI Responsive.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
// Run request on background queue (thread).
dispatch_async(queue, ^
NSError *error = nil;
// Request the data and store in a string.
NSString *json = [NSString stringWithContentsOfURL:jsonURL
encoding:NSASCIIStringEncoding
error:&error];
if (error == nil)
// Convert the String into an NSData object.
NSData *jsonData = [json dataUsingEncoding:NSASCIIStringEncoding];
// Parse that data object using NSJSONSerialization without options.
jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
// Parsing success.
if (error == nil)
// Go back to the main thread and update the table with the json data.
// Keeps the user interface responsive.
dispatch_async(dispatch_get_main_queue(), ^
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
data= [[jsonDict valueForKey:@"Result"] valueForKey:@"data"];
[jsonTable reloadData];
);
// Parsing failed, display error as alert.
else
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Uh Oh, Parsing Failed." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
[alertView show];
// Request Failed, display error as alert.
else
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Request Error! Check that you are connected to wifi or 3G/4G with internet access." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
[alertView show];
);
// Delegate call back for cell at index path.
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];
// Set the main label as the episode name.
cell.textLabel.text = [[data objectAtIndex:indexPath.row] objectForKey:@"fullname"];
NSNumber *seasonNum = [[data objectAtIndex:indexPath.row] objectForKey:@"username"];
NSNumber *episodeNum = [[data objectAtIndex:indexPath.row] objectForKey:@"location"];
NSMutableString *seasonEpisodeNum = [NSMutableString stringWithFormat:@"username: %@ ", seasonNum];
[seasonEpisodeNum appendString:[NSMutableString stringWithFormat:@"location: %@", episodeNum]];
cell.detailTextLabel.text = seasonEpisodeNum;
return cell;
-(int) numberOfSectionsInTableView:(UITableView *) tableView
return 1;
- (int) tableView:(UITableView *) tableView numberOfRowsInSection: (NSInteger)section
return [data count];
此代码实现 .m 文件
和.h文件
NSDictionary *jsonDict;
IBOutlet UITableView *jsonTable;
NSArray *data;
NSURL *url;
【讨论】:
以上是关于如何使用带有 NSJSONSerialization 类参考的 xcode 4.3.1 从 URL 获取数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在本地使用带有 express 的 graphql 和带有 mongoose 的 mongodb 来检索文档?
如何使用带有路径的“开始”和带有空格的命令在 Windows 中创建批处理文件