Tengo un objeto JSON que proviene de un servidor web.
El registro es algo como esto:
{
"status":"success",
"UserID":15,
"Name":"John",
"DisplayName":"John",
"Surname":"Smith",
"Email":"email",
"Telephone":null,
"FullAccount":"true"
}
Tenga en cuenta que el teléfono entra como nulo si el usuario no ingresa uno.
Al asignar este valor a a NSString
, en el NSLog
aparece como<null>
Estoy asignando la cadena así:
NSString *tel = [jsonDictionary valueForKey:@"Telephone"];
¿Cuál es la forma correcta de verificar este <null>
valor? Me impide salvar un NSDictionary
.
He intentado usar las condiciones [myString length]
y myString == nil
ymyString == NULL
Además, ¿cuál es el mejor lugar en la documentación de iOS para leer sobre esto?
ios
objective-c
json
Chris
fuente
fuente
if ([tel isKindOfClass:[NSNull class]])
Aquí está el ejemplo con el elenco:
if (tel == (NSString *)[NSNull null]) { // do logic here }
fuente
También puede verificar esta Cadena entrante de esta manera también: -
if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""]) { NSlog(@"Print check log"); } else { NSlog(@Printcheck log %@",tel); }
fuente
NSLog
línea es incorrecta ... debería decir que la cadena está vacía. ¿Y por qué lo imprimirías en ese caso?NSLog
Si se trata de una API "inestable", es posible que desee recorrer todas las claves para comprobar si son nulas. Creé una categoría para lidiar con esto:
@interface NSDictionary (Safe) -(NSDictionary *)removeNullValues; @end @implementation NSDictionary (Safe) -(NSDictionary *)removeNullValues { NSMutableDictionary *mutDictionary = [self mutableCopy]; NSMutableArray *keysToDelete = [NSMutableArray array]; [mutDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { if (obj == [NSNull null]) { [keysToDelete addObject:key]; } }]; [mutDictinary removeObjectsForKeys:keysToDelete]; return [mutDictinary copy]; } @end
fuente
La mejor respuesta es la que ha comentado Aaron Hayman a continuación de la respuesta aceptada:
if ([tel isKindOfClass:[NSNull class]])
No produce una advertencia :)
fuente
si tiene muchos atributos en json, usar la
if
declaración para verificarlos uno por uno es problemático. Lo que es aún peor es que el código sería feo y difícil de mantener.Creo que el mejor enfoque es crear una categoría de
NSDictionary
:// NSDictionary+AwesomeDictionary.h #import <Foundation/Foundation.h> @interface NSDictionary (AwesomeDictionary) - (id)validatedValueForKey:(NSString *)key; @end // NSDictionary+AwesomeDictionary.m #import "NSDictionary+AwesomeDictionary.h" @implementation NSDictionary (AwesomeDictionary) - (id)validatedValueForKey:(NSString *)key { id value = [self valueForKey:key]; if (value == [NSNull null]) { value = nil; } return value; } @end
después de importar esta categoría, puede:
fuente
Normalmente lo hago así:
Supongo que tengo un modelo de datos para el usuario y tiene una propiedad NSString llamada correo electrónico, obtenida de un dictado JSON. Si el campo de correo electrónico se utiliza dentro de la aplicación, convertirlo en una cadena vacía evita posibles bloqueos:
- (id)initWithJSONDictionary:(NSDictionary *)dictionary{ //Initializer, other properties etc... id usersmail = [[dictionary objectForKey:@"email"] copy]; _email = ( usersmail && usersmail != (id)[NSNull null] )? [usersmail copy] : [[NSString alloc]initWithString:@""]; }
fuente
En Swift puedes hacer:
let value: AnyObject? = xyz.objectForKey("xyz") if value as NSObject == NSNull() { // value is null }
fuente
Lo mejor sería seguir las mejores prácticas, es decir, utilizar un modelo de datos real para leer datos JSON.
Eche un vistazo a JSONModel: es fácil de usar y convertirá [NSNUll null] a valores * nil * automáticamente, por lo que podría hacer sus comprobaciones como de costumbre en Obj-c como:
if (mymodel.Telephone==nil) { //telephone number was not provided, do something here }
Eche un vistazo a la página de JSONModel: http://www.jsonmodel.com
Aquí también hay un recorrido sencillo para crear una aplicación basada en JSON: http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and-jsonmodel/
fuente
Intenté mucho método, pero nada funcionó. Finalmente esto funcionó para mí.
NSString *usernameValue = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"usernameKey"]]; if ([usernameValue isEqual:@"(null)"]) { // str is null }
fuente
if([tel isEqual:[NSNull null]]) { //do something when value is null }
fuente
Prueba esto:
if (tel == (NSString *)[NSNull null] || tel.length==0) { // do logic here }
fuente
Yo uso esto:
#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; })
fuente
si obtenemos un valor nulo como, entonces podemos verificarlo con el siguiente fragmento de código.
if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]]) strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"]; else strPsngrMobileNo = @"";
fuente
Aquí también puede hacerlo verificando la longitud de la cadena, es decir,
if(tel.length==0) { //do some logic here }
fuente
tel
es una instancia deNSNull
, esto generará una excepción.