2012-03-17 6 views
5

Sto cercando di capire come funziona il NSJSONSerialization Class Reference. Nella mancanza di un esempio di codice sul sito web developer.apple.com, sono perso. Ci sono milioni di esempi su tutto il web con altre librerie json, ma non sono stato in grado di far funzionare nessuno con l'ultima versione di xcode. (Sto correndo: versione 4.3.1 (4E1019) e test su iPhone 5.0.1)Come recuperare i dati dall'URL, usando xcode 4.3.1 con NSJSONSerialization Riferimento di classe

Voglio recuperare i dati dal file json nel mio iphone utilizzando un pulsante.

Diciamo i miei dati dal URL: http://companyurl/jsonfile.json (JSON-formato standard)

Il jsonfile.json sembra somthing come questo ...;

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

Cosa scrivere nel mio .h e nel mio file .m?

Grazie per qualsiasi aiuto! :)

+0

Aiuta a cercare prima di chiedere: [come utilizzare NSJSONSerialization] (http://stackoverflow.com/questions/8356842 /), [recupero dei dati dall'URL] (http://stackoverflow.com/questions/2034066/) – rickster

risposta

7

Grazie ragazzi. L'avevo capito. (... e qui è quello che ho fatto :)

Nel mio file .m ho aggiunto questo codice:

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

Nel mio file .h, ho aggiunto questo codice:

@interface ViewController : UIViewController 
- (IBAction)getDataFromJson:(id)sender; 
15
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: Questo codice funziona su Xcode 4.2 con iOS 5.01 sul simulatore e 5.1 sul dispositivo iPad al momento

+0

risposta è id , non id * – hop

1

Mai e poi mai utilizzare dataWithContentsOfURL: per ottenere i dati del server in questo modo. È incontrollabile e può lasciare la tua applicazione in uno stato sconosciuto. Dovresti, come minimo, effettuare tutte le chiamate URL con NSURLRequest. Meglio ancora, se non supporti pre iOS7, usa NSURLSession.

0
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]; 
} 

questo codice implementare il file .m

e file h

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