Checking a null value in Objective-C that has been returned from a JSON string

I have a JSON object that is coming from a webserver.

The log is something like this:

{          
   "status":"success",
   "UserID":15,
   "Name":"John",
   "DisplayName":"John",
   "Surname":"Smith",
   "Email":"email",
   "Telephone":null,
   "FullAccount":"true"
}

Note the Telephone is coming in as null if the user doesn't enter one.

When assigning this value to a NSString, in the NSLog it's coming out as <null>

I am assigning the string like this:

NSString *tel = [jsonDictionary valueForKey:@"Telephone"];

What is the correct way to check this <null> value? It's preventing me from saving a NSDictionary.

I have tried using the conditions [myString length] and myString == nil and myString == NULL

Additionally where is the best place in the iOS documentation to read up on this?


Solution 1:

<null> is how the NSNull singleton logs. So:

if (tel == (id)[NSNull null]) {
    // tel is null
}

(The singleton exists because you can't add nil to collection classes.)

Solution 2:

Here is the example with the cast:

if (tel == (NSString *)[NSNull null])
{
   // do logic here
}

Solution 3:

you can also check this Incoming String like this way also:-

if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""])
{
    NSlog(@"Print check log");
}
else
{  

    NSlog(@Printcheck log %@",tel);  

}

Solution 4:

If you are dealing with an "unstable" API, you may want to iterate through all the keys to check for null. I created a category to deal with this:

@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

Solution 5:

The best answer is what Aaron Hayman has commented below the accepted answer:

if ([tel isKindOfClass:[NSNull class]])

It doesn't produce a warning :)