entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

JSON: La operacion no se a completado

Al recuperar un JSON con AFJSONRequestOperation me retorna el siguiente error:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be
completed. (Cocoa error 3840.)" (JSON text did not start with array or
object and option to allow fragments not set.) UserInfo=0x9b32be0
{NSDebugDescription=JSON text did not start with array or object and
option to allow fragments not set.

He probado de usar:

operation.JSONReadingOptions = NSJSONReadingAllowFragments;`

Pero me retorna lo siguiente:

-[NSNull JSONData]: unrecognized selector sent to instance 0x1e08068 2013-09-21 01:04:43.994 RecipeBook[2169:a0b] Terminating app due
to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull
JSONData]: unrecognized selector sent to instance 0x1e08068'
First throw call stack:

1 Respuesta

3votos

juancruzmdq Puntos1500

El servidor te esta respondiendo "null" y afnetworking lo convierte a un objeto de clase NSNull

para probar si la respuesta es null podes hacer:

AFJSONRequestOperation *operation =[AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest* _request, NSHTTPURLResponse* response, id JSON) {
    if ([JSON isEqual:[NSNull null]]) {
        NSLog(@"es null");
    }
} failure:^(NSURLRequest *_request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"%@ %@",error,JSON);
}];

La próxima ves trata de poner mas información en la pregunta, como por ejemplo un segmento del código que te genera el error.

Saludos

0voto

victor_capilla comentado

Aqui va un poquito de codigo fresco:

AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
     // 3
   success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

   NSArray *jsonGuardado = [self arrayFromJson:JSON];

       arrayCodigos = [NSMutableArray arrayWithArray:[jsonGuardado valueForKey:@"code"]];
}

Despues de esto iria el failure donde mostramos el error en caso de que haya error:

failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
  UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                     message:[NSString SringWithFormat:@"%@",error]
                      delegate:nil
                      cancelButtonTitle:@"OK" otherButtonTitles:nil];
                      NSLog(@"%@",error);
                       [av show];

La cuestión es que soy consciente de que puede retornarme un JSON vacío, es decir, usando la misma función en el fichero php que retorna valores, puede que no me retorne nada y quiero que funcione así ya que trabajo de forma inversa, quiero saber los valores que hay guardados en la base de datos para mostrar por pantalla los que NO están guardados, el tema esta en que si la consulta me devuelve algún valor dentro del JSON el programa funciona perfectamente.

0voto

juancruzmdq comentado

perdona, pero no entiendo cual es tu pregunta?

0voto

victor_capilla comentado

Mi idea es la siguiente: Teniendo una base de datos MySQL hago consultas desde la app mvl para obtener los datos que tengo guardados y comparándolos con un array de mi app muestro los datos que no están guardados en la base de datos. El tema esta en que si al hacer la consulta resulta que no existe ningún registros que tengo en el array, el JSON de repuesta vuelve vacío y al volver vacío quiero mostrar todos lo que tengo dentro del array, pero al llegar vacío me retorna ese error.

0voto

juancruzmdq comentado

Vamos por partes :)

primero:
Te sirvio lo que te respondi antes? comparar con NSNull?

seteando esta propiedad
operation.JSONReadingOptions = NSJSONReadingAllowFragments;`
esta entrando por success?

si no te sirvio, que error estas teniendo?

Segundo:
por lo que veo en la informacion que mandaste, la API esta retornando un null, o algun json invalido. es cierto esto?

Tercero:
Vos tenes control con la API, o es de un tercero?
Me parece que el problema esta del lado de la API.
Si una llamada te tiene que devolver un array de elementos, siempre te tiene que devolver un listado de elementos, aunque sea un array vacio.

0voto

victor_capilla comentado

Ok, perdona, no me había empanao del tema. Lo que he hecho ahora es pasar el código que me has dado tu de comprobar si es null y si lo es mostrarlo en el log y si no lo es continuar y me funciona solo si pongo el operation.JSONReadingOptions. El problema es que ahora estoy haciendo otra consulta que en vez de obtener datos, guarda datos, y me retorna que la URL es mala. Creare otro hilo para esto.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta