目标c从url请求parsingjson

我试图parsing一个jsonstring请求从api位于: http : //www.physics.leidenuniv.nl/json/news.php

但是,我有麻烦分析这个JSON。 我得到以下错误: Unexpected end of file during string parse

我已经找了几个小时,但是我找不到这个问题的答案。

我的代码片段:

在我的viewDidLoad中:

 NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:@"http://www.physics.leidenuniv.nl/json/news.php"]]; [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

代表:

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSMutableData *responseData = [[NSMutableData alloc] init]; [responseData appendData:data]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSError *e = nil; NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e]; } 

有人知道这个问题的答案,所以我可以parsingJSON数据?

这样做:

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // Append the new data to receivedData. // receivedData is an instance variable declared elsewhere. [responseData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSError *e = nil; NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e]; } 

我会build议这样做:

 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.physics.leidenuniv.nl/json/news.php"]]; __block NSDictionary *json; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"Async JSON: %@", json); }]; 

或者,如果出于任何原因(不推荐),你想要运行一个同步请求,你可以这样做:

 NSData *theData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:theData options:0 error:nil]; NSLog(@"Sync JSON: %@", newJSON); 
 //call this method -(void)syncWebByGETMethod { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; NSString *urlString = [NSString stringWithFormat:@"http://www.yoursite.com"]; NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError) { if (data) { id myJSON; @try { myJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; } @catch (NSException *exception) { } @finally { } jsonArray = (NSArray *)myJSON; NSLog(@"mmm %@",jsonArray); } }]; } 

一个解决scheme是使用NSURLConnection sendSynchronousRequest:returningResponse:error: ( docs )。 在完成处理程序中,您将拥有所有响应数据,而不仅仅是您在委托connection:didReceiveData:获取的部分数据connection:didReceiveData:方法。

如果您想继续使用委托,您需要遵循Apple文档中的build议:

委托应该连接每个交付的数据对象的内容,以构buildURL加载的完整数据。

志愿者匹配API Objective C

我正在使用一个常见的方法进行AFNetworking WS调用。 用途:

呼叫WS:

 NSDictionary* param = @{ @"action":@"helloWorld", @"query":@"{\"name\":\"john\"}" }; [self requestWithUrlString:@"URL" parmeters:paramDictionary success:^(NSDictionary *response) { //code For Success } failure:^(NSError *error) { // code for WS Responce failure }]; 

添加两个方法:这两个方法是常见的,你可以使用这些常用的方法在整个项目中使用NSObject类。 还添加/ /定义错误代码,如…

定义kDefaultErrorCode 12345

 - (void)requestWithUrlString:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure { [self requestWithUrl:stUrl parmeters:parameters success:^(NSDictionary *response) { if([[response objectForKey:@"success"] boolValue]) { if(success) { success(response); } } else { NSError *error = [NSError errorWithDomain:@"Error" code:kDefaultErrorCode userInfo:@{NSLocalizedDescriptionKey:[response objectForKey:@"message"]}]; if(failure) { failure(error); } } } failure:^(NSError *error) { if(failure) { failure(error); } }];} 

和/ /在下面的方法设置标题(如果需要,否则删除)

 - (void)requestWithUrl:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *))failure { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; [manager.requestSerializer setValue:@"WWSE profile=\"UsernameToken\"" forHTTPHeaderField:@"Authorization"]; [manager GET:stUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if([responseObject isKindOfClass:[NSDictionary class]]) { if(success) { success(responseObject); } } else { NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; if(success) { success(response); } } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); if(failure) { failure(error); } }];} 

对于任何问题和更多详情请访问.AFNetworking

 -(void)getWebServic{ NSURL *url = [NSURL URLWithString:@"----URL----"]; // 2 NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *jsonObject=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; [self loadDataFromDictionary:(NSArray*)jsonObject]; NSLog(@"data: %@",jsonObject); }]; // 3 [downloadTask resume]; } 

简单的方法来存储json-url数据在字典中。

  NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://query.yahooapis.com/v1/public/yql?q=select+%2A+from+weather.forecast+where+woeid%3D1100661&format=json"]]; NSError *error=nil; id response=[NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&error]; if (error) { NSLog(@"%@",[error localizedDescription]); } else { _query = [response objectForKey:@"query"]; NSLog(@"%@",_query); 

你可以试试这个很简单