2012-06-03 13 views
6

Estoy trabajando con el objetivo c para una aplicación de iphone.if instrucción para el diccionario objectforkey: @ "clave" cuando el valor es <null>

Veo que [dictionary objectForKey:@"key"] devuelve <null>. Hacer un if([dictionary objectForKey:@"key"] == nil || [dictionary objectForKey:@"key"] == null) no parece detectar este caso.

Haciendo un if([[dictionary objectForKey:@"key"] isEqualToString:@"<null>"]) hace que mi programa se cuelgue.

¿Cuál es la expresión correcta para capturar <null>?

Más detalles Una sentencia if para nil todavía no está alcanzando el caso ... Tal vez estoy demasiado cansado para ver algo, pero aquí está el Info adicional:

diccionario está poblada través de una URL que contiene datos JSON de este modo:

NSURL *url = [NSURL URLWithString:"http://site.com/"]; 

dataresult = [NSData dataWithContentsOfURL:url]; 

NSError *error; 
NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:dataresult options:kNilOptions error:& error]; 

haciendo un NSLog en el diccionario da esta salida:

{ 
    key = "<null>"; 
    responseMessage = "The email/registration code combination is incorrect"; 
} 
+0

disculpe mi error, lo cambié a diccionarios ... estoy muy cansado en este momento – John

+0

Hmmm ... ahora que estoy mirando un poco más de cerca su pregunta, * ya * está buscando nada en su caso "si". Si hace algo así como "' id something = [dictionary objectForKey: @ "clave"]; '" en su código y establece un punto de interrupción de depuración allí, ¿es * algo * algo o es nulo? –

+0

la salida de algo es ''. El feed json fue generado por un sitio web php. Eso hace una diferencia? – John

Respuesta

12

Tiene una instancia de NSNull. En realidad, la instancia, ya que es un singleton.

Las colecciones de cacao no pueden contener nil, aunque pueden devolver nil si intenta acceder a algo que no está presente.

Sin embargo, a veces es valioso para un programa almacenar algo que significa "nada" en una colección. Eso es lo que NSNull es para.

Da la casualidad que JSON puede representar objetos nulos. Entonces, al convertir JSON a una colección Cocoa, esos objetos nulos se traducen al objeto NSNull.

Cuando Cocoa formatea una cadena con un especificador "% @", un valor nil se formateará como "(nulo)" con paréntesis. Un valor NSNull se formateará como "< null>" con corchetes angulares.

+4

WOOO HOOOOO !!!!!! Es el NSNull! ahora mi sentencia if se ve tan hermosa 'if ([fullDataArray objectForKey: @" clave]] == nil || [fullDataArray objectForKey: @ "clave"] == NULL || [[fullDataArray objectForKey: @ "key"] isKindOfClass: [NSNull class]]) {/ * ¡Mira, estoy dentro! Ahora el tiempo para dormir * /} ' – John

+1

' nil' y 'NULL' son equivalentes, por lo que no es necesario verificar la igualdad con ambos; y usted puede decir 'if ([fullDataArray objectForKey: @" clave]] || ... '. – echristopherson

+0

@echristopherson, quiere decir' if (! [fullDataArray objectForKey: @ "clave"] || ... 'con un operador NOT ("!"), para que coincida con la condición de John, donde está comprobando la igualdad a 'nil' /' NULL'. –

3

Nueva respuesta:

Gracias por agregar los detalles. Parece que la "dataresult" se está configurando es no un objeto JSON por lo que no es de extrañar que está obteniendo resultados extravagantes de poner una cadena en bruto en "[NSJSONSerialization JSONObjectWithData:]. Es posible que tenga que hacer la comprobación algún error básico en los datos antes de se llama a nada relacionado JSON

respuesta original:.

primer lugar, si esto fuera mi código, no reveló el nombre de "NSDictionary" objeto "array" (y veo que usted cogió mi comentario en su edición ... espero que duermas un poco pronto!).

Se condly, lo que está buscando es "nil", no una cadena llamada "<null>". Como Apple's documentation for objectForKey: states, si no se encuentra un objeto para la clave que está solicitando, se devuelve un cero. La consola de Xcode intenta ser útil en la conversión de objetos nil a cadenas "<null>" en su salida.

Haz "if [dictionary objectForKey: @"key"] != nil" y deberías estar más feliz.

+0

Pero el script php hizo un json_encode ($ array) para generar contenido. Formando mi código C objetivo, no tengo ningún problema para acceder a cualquiera de los otros pares de valores clave fmro del diccionario. ¿Estás seguro de que este no es un objeto json? – John

+0

Para risitas, convierta el objeto 'NSData' en' NSString' (o simplemente recupere los datos de la URL mediante '[NSString stringWithContentsOfURL:]') y 'NSLog' fuera para ver si le parece que JSON. –

2

sólo tiene que utilizar el siguiente código:

if ([[dictionary valueForKey:@"key"] isKindOfClass:[NSNull Class]]{ 
    //This means that the value inside the dictionary is <null> 
} 
else{ 
//the value is not <null> 
} 

Esto debe hacerlo.

Cuestiones relacionadas