Проверка нулевого значения в Objective-C, возвращенного из строки JSON


у меня есть JSON объект, который поступает с веб-сервера.

журнал выглядит примерно так:

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

обратите внимание, что телефон поступает как null, если пользователь не вводит его.

при присвоении этого значения NSString, в NSLog это выходит как <null>

я назначаю строку следующим образом:

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

каков правильный способ проверить это <null> значение? Это мешает мне от спасения NSDictionary.

я пробовал использовать условия [myString length] и myString == nil и myString == NULL

кроме того, где находится лучшее место в документации iOS, чтобы прочитать об этом?

15 78

15 ответов:

<null> как NSNull синглтон журналы. Итак:

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

(одноэлементный существует, потому что вы не можете добавить nil для сбора классов.)

вот пример с актерами:

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

вы также можете проверить эту входящую строку следующим образом: -

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

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

}

Если вы имеете дело с" нестабильным " API, вы можете повторить все ключи, чтобы проверить наличие null. Я создал категорию, чтобы иметь дело с этим:

@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

лучший ответ - это то, что Аарон Хейман прокомментировал ниже принятого ответа:

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

он не выдает предупреждение :)

если у вас есть много атрибутов в JSON, используя if заявление, чтобы проверить их один за другим хлопотно. Что еще хуже, что код будет уродливым и трудно поддерживать.

Я думаю, что лучший подход-это создание категории 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

после импорта этой категории, вы можете:

[json validatedValueForKey:key];

обычно я делаю это так:

Assuma у меня есть модель данных для пользователя, и она имеет свойство NSString под названием email, полученное из JSON dict. Если поле электронной почты используется внутри приложения, преобразование его в пустую строку предотвращает возможные сбои:

- (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:@""];
}

в Swift вы можете сделать:

let value: AnyObject? = xyz.objectForKey("xyz")    
if value as NSObject == NSNull() {
    // value is null
    }

лучше всего было бы, если вы придерживаетесь лучших практик - т. е. использовать реальную модель данных для чтения данных JSON.

посмотрите на JSONModel - он прост в использовании, и он преобразует [nsnull null] в * Нил * значения для вас автоматически, так что вы можете сделать ваши проверки, как обычно в Obj-c, как:

if (mymodel.Telephone==nil) {
  //telephone number was not provided, do something here 
}

посмотрите на страницу JSONModel:http://www.jsonmodel.com

вот также простой проход для создания приложения на основе JSON: http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and-jsonmodel/

Я пробовал много метод, но ничего не получилось. Наконец - то это сработало для меня.

NSString *usernameValue = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"usernameKey"]];

if ([usernameValue isEqual:@"(null)"])
{
     // str is null
}
if([tel isEqual:[NSNull null]])
{
   //do something when value is null
}

попробуйте это:

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

Я использую этот:

#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; }) 

если мы получаем нулевое значение, то мы можем проверить его с помощью приведенного ниже фрагмента кода.

 if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]])
      strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"];
  else
           strPsngrMobileNo = @"";

здесь вы также можете сделать это, проверяя длину строки, т. е.

if(tel.length==0)
{
    //do some logic here
}