2012-03-19 21 views
5

Actualización: Acabo de probar mi formato JSON devuelto desde el servidor usando JSONlint y está bien.error de selector no reconocido con NSJSONSerialization + AFNetworking

Recibo una excepción con NSJSONSerialization en una llamada AFNetworking a un script php que devuelve datos JSON. He analizado las otras preguntas aquí con el mismo problema e intenté con esas soluciones, pero sigo recibiendo el error.

Se estrella en esta línea:

NSError *e = nil; 
NSMutableArray *jsonArray = 
[NSJSONSerialization JSONObjectWithData: jsonData 
           options: NSJSONReadingMutableContainers 
            error: &e]; 

Error Log:

2012-03-19 18: 10: 41.291 ImageUploader [3538: 207] * de terminación aplicación debido a una excepción no detectada 'NSInvalidArgumentException', razón: '- [__ NSCFArray bytes]: selector no reconocido enviado a la instancia 0x6867430'

Mis datos JSON, cuando llamo al script PHP a través del navegador se parece a esto:

[{ "usuario": "chupete", "camino": "chupete-0a96f9aab5267c8.jpg"," índice ":" 101 "}, {" usuario ":" binky "," ruta ":" binky-9cf844252c28553.jpg "," index ":" 102 "}, {" user ":" binky "," path " : "binky-d6c749d25d33015.jpg", "índice": "103"}]

el NSLog de los datos se ve así:

( { índice = 101; path = "binky-0a96f9aab5267c8.jpg"; user = binky; }, { índice = 102; path = "binky-9cf844252c28553.jpg"; user = binky; }, { índice = 103; path = "binky-d6c749d25d33015.jpg"; user = binky; })

Por último, hago una prueba para asegurarse de que tengo los datos JSON válida:

  if ([NSJSONSerialization isValidJSONObject: jsonData]){ 
      NSLog(@"Good JSON \n"); 
     } 

Así que no se puede entender que la fuente de mi error es. ¿Un poco de ayuda?

// operación AFNetworking + bloque

AFJSONRequestOperation *operation = 
    [AFJSONRequestOperation JSONRequestOperationWithRequest:myRequest 
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonData) { 

     NSLog(@"Success JSON data:\n %@ \n", jsonData); //log data 

     if ([NSJSONSerialization isValidJSONObject: jsonData]){ 
      NSLog(@"Good JSON \n"); 
     } 

     NSError *e = nil; 
     NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e]; 

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

     [self.navigationController popToRootViewControllerAnimated:YES]; 
    } 
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 

     NSLog(@"Error: %@", error); 
     [self.navigationController popToRootViewControllerAnimated:YES]; 
    }]; 

Respuesta

7

Aparently JSONObjectWithData espera NSData en lugar de una matriz. id jsonData parece ser una matriz que representa el contenido de su cadena json. Aparentemente estás esperando una matriz de todos modos.

Por alguna razón lo estás haciendo dos veces.En lugar de

NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e]; 

simplemente podría utilizar

NSMutableArray *jsonArray = [NSMutableArray arrayWithArray:jsonData]; 

o, si no tiene por qué ser mutable:

NSArray *jsonArray = (NSArray *) jsonData; 

Sin embargo, siempre se debe comprobar si es realmente una matriz en jsonData. Dependiendo de la estructura dentro de la cadena json, podría ser un NSDictionary o nil en caso de errores.

+0

gracias. Convertir los jsondata entrantes a un trabajo 'NSMutableArray' pero entonces no entiendo por qué necesitaría' NSJSONSerialization' aquí (se usa en muchos ejemplos de código que son como los míos). –

Cuestiones relacionadas