2012-07-31 13 views
5

Soy nuevo en el desarrollo de iOS. Uso este código para conectarme a mi servicio web REST y obtener datos en formato Json.Parse json con NSJSONSerialización clase utilizando objectForKey en iOS

NSString *[email protected]"URL_Address"; 

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 

    NSURLResponse *resp = nil; 
    NSError *err = nil; 

    NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &err]; 

// NSString * theString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
// NSLog(@"response: %@", theString); 

    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: response options: NSJSONReadingMutableContainers error: &err]; 

    if (!jsonArray) { 
     NSLog(@"Error parsing JSON: %@", err); 
    } else { 
     for(NSDictionary *item in jsonArray) { 
      NSLog(@" %@", item); 
      NSLog(@"---------------------------------"); 
     } 
    } 

Ahora quiero separarlos mediante objectForKey. Utilicé este código dentro del ciclo:

NSString *name = [item objectForKey:@"name"]; 

No funciona. Obtuve este error:

2012-07-31 12:48:38.426 LearningAFNetworking[390:f803] -[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x6844460 
2012-07-31 12:48:38.428 LearningAFNetworking[390:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x6844460' 
*** First throw call stack: 
(0x13c8022 0x1559cd6 0x13c9cbd 0x132eed0 0x132ecb2 0x2f40 0x2bf8 0xd9a1e 0x38401 0x38670 0x38836 0x3f72a 0x290b 0x10386 0x11274 0x20183 0x20c38 0x14634 0x12b2ef5 0x139c195 0x1300ff2 0x12ff8da 0x12fed84 0x12fec9b 0x10c65 0x12626 0x254d 0x24b5 0x1) 
terminate called throwing an exception(lldb) 

me puedes ayudar?

Respuesta

2

hay que acceder a la opción de 0item matriz:

NSArray *mainArray = [item objectAtIndex:0]; 
(NSDictionary *obj in mainArray) { 
    NSString *name = [obj objectForKey:@"name"]; 
} 

Cuando se produjo el error: -[__NSArrayM objectForKey:], tiene que darse cuenta de que el objeto que está intentando acceder no es un diccionario. Es una matriz (__NSArrayM), por lo que primero debe acceder al índice 0 y luego comenzar a explorar el diccionario.

Eche un vistazo a this increíble tutorial, de Ray Wenderlich, que explica todo sobre los accidentes.

0

A partir del error y de la salida de registro de su código, parece que está intentando ejecutar el selector objectForKey en un NSArray. tratar de cambiar a NSString *name = [item objectForKey:@"name"];NSString *name = [[item objectAtIndex: 0]objectForKey:@"name"];

2

Como dijo Alberto, se supone que es un elemento NSDictionary mientras que en realidad es un NSArray que contiene múltiples diccionarios. Ahora para la parte detallada, puede usar valueForKeyPath como se muestra a continuación. Así que su bucle for debe ser algo como esto:

NSArray *items = [jsonArray objectAtIndex:0]; 

for (NSDictionary *item in items){ 
    NSString *name = [item valueForKey:@"name"]; 
    // You can also get nested properties like this 
    NSString *projectName = [item valueForKeyPath:@"project.name"]; 
} 

Otra cosa útil saber es que si desea obtener todos los valores 'nombre', por ejemplo, podría utilizar valueForKey en su conjunto items, que le llame automáticamente al valueForKey en cada diccionario. Ejemplo:

NSArray *items = [jsonArray objectAtIndex:0]; 
NSArray *names = [items valueForkey:@"name"]; 
+0

aprecio por su aclaración. Fue útil – Ali

+0

@Ali Me alegro de que lo haya encontrado útil :) – Alladinian

0

mayo de este código ayudará a conseguir el primer objeto del diccionario de tipo de la NSArray

[[jsonArray objectAtIndex:0]objectForKey:@"object-key"]; 
0
-(void)clientServerCommunication 
{ 
    NSURL *url = [NSURL URLWithString:@"http://182.72.122.106/iphonetest/getTheData.php"]; 
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:req delegate:self]; 
    if (connection) 
    { 
     webData = [[NSMutableData alloc]init]; 
    } 
} 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [webData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [webData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:webData options:0 error:nil]; 

    /*Third party API 
    NSString *respStr = [[NSString alloc]initWithData:webData encoding:NSUTF8StringEncoding]; 
    SBJsonParser *objSBJson = [[SBJsonParser alloc]init]; 
    NSDictionary *responseDict = [objSBJson objectWithString:respStr]; */ 
    resultArray = [[NSArray alloc]initWithArray:[responseDict valueForKey:@"result"]]; 
    NSLog(@"resultArray: %@",resultArray); 
    [self.tableView reloadData]; 
} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    custcell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 



    if(custcell==nil) 
    { 

     custcell=[[[NSBundle mainBundle]loadNibNamed:@"custumCell" owner:self options:nil]objectAtIndex:0]; 

    } 


    custcell.persnName.text=[[arr objectAtIndex:indexPath.row]valueForKey:@"Name"]; 
    //else if (objsegment.selectedSegmentIndex==1) 
    //{ 
    custcell.persnAge.text=[[arr objectAtIndex:indexPath.row]valueForKey:@"Age"]; 

    [sortcontrol addTarget:self action:@selector(SegmentbtnCLK:) forControlEvents:UIControlEventValueChanged]; 

    //objsegment.selectedSegmentIndex=0; 
    // } 

    return custcell; 
} 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Navigation logic may go here, for example: 
    //Create the next view controller. 
    detailViewController *detailViewController1 = [[detailViewController alloc]initWithNibName:@"detailViewController" bundle:nil]; 

//detailViewController *detailViewController = [[detailViewController alloc] initWithNibName:@"detailViewController" bundle:nil]; 

// Pass the selected object to the new view controller. 

// Push the view controller. 
detailViewController1.nextDict = [[NSDictionary alloc]initWithDictionary:[resultArray objectAtIndex:indexPath.row]]; 
[self.navigationController pushViewController:detailViewController1 animated:YES]; 

    // Pass the selected object to the new view controller. 

    // Push the view controller. 
    // [self.navigationController pushViewController:detailViewController animated:YES]; 
} 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    empName.text=[nextDict valueForKey:@"name"]; 
    deptlbl.text=[nextDict valueForKey:@"department"]; 
    designationLbl.text=[nextDict valueForKey:@"designation"]; 
    idLbl.text=[nextDict valueForKey:@"id"]; 
    salaryLbl.text=[nextDict valueForKey:@"salary"]; 
    NSString *ImageURL = [nextDict valueForKey:@"image"]; 
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]]; 
    image.image = [UIImage imageWithData:imageData]; 
}