¿Cómo obtengo datos de la URL, utilizando xcode 4.3.1 con NSJSONSerialization Class Reference

Estoy intentando concentrarme en la reference de class de NSJSONSerialization . En la falta de un ejemplo de código en el website developer.apple.com, estoy perdido. Hay millones de ejemplos en toda la web con otras librerías json, pero no he podido hacer que ninguno de ellos funcione con la última versión de xcode. (Estoy corriendo: la versión 4.3.1 (4E1019) y las testings en el iPhone 5.0.1)

Quiero search los datos del file json en mi iphone usando un button.

Digamos que obtengo mis datos de la URL: http: //companyurl/jsonfile.json (formatting JSON estándar)

El jsonfile.json parece algo así …;

{ "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", } ] } 

¿Qué escribo en mi file .h y mi .m?

¡Gracias por cualquier ayuda! 🙂

 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); 

NOTA: Este código funciona en Xcode 4.2 con iOS 5.01 en el simulador y 5.1 en el dispositivo iPad en este momento

Gracias chicos. Me lo imaginé. (… y aquí es lo que hice 🙂

En mi file .m, agregué este código:

  - (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); } } 

En mi file .h, agregué este código:

 @interface ViewController : UIViewController - (IBAction)getDataFromJson:(id)sender; 

Nunca jamás use dataWithContentsOfURL: para get los datos del server de esta manera. Es incontrolable y puede dejar su aplicación en un estado desconocido. Debería, como mínimo, hacer todas las llamadas de url con NSURLRequest. Mejor aún, si no es compatible con pre iOS7, use NSURLSession.

Hay un ejemplo de código en forma de aplicación de ejemplo Tweeting .

  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 shanetworkingApplication].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 shanetworkingApplication].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]; } 

este código implementa el file .m

y el file .h

  { NSDictionary *jsonDict; IBOutlet UITableView *jsonTable; NSArray *data; NSURL *url; }