Проверка нулевого значения в Objective-C, которое было возвращено из строки JSON - PullRequest
77 голосов
/ 29 января 2011

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

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

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

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

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

Я присваиваю строку какthis:

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

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

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

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

Ответы [ 15 ]

188 голосов
/ 30 января 2011

<null> - как регистрируется одноэлементный NSNull. Итак:

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

(Синглтон существует, потому что вы не можете добавить nil к классам коллекции.)

24 голосов
/ 07 марта 2012

Вот пример с приведением:

if (tel == (NSString *)[NSNull null])
{
   // do logic here
}
10 голосов
/ 06 февраля 2013

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

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

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

}
9 голосов
/ 16 октября 2013

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

@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
4 голосов
/ 13 декабря 2013

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

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

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

3 голосов
/ 01 ноября 2013

если у вас много атрибутов в 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];
2 голосов
/ 17 ноября 2014

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

let value: AnyObject? = xyz.objectForKey("xyz")    
if value as NSObject == NSNull() {
    // value is null
    }
2 голосов
/ 27 декабря 2013

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

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

- (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:@""];
}
0 голосов
/ 15 марта 2017

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

 if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]])
      strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"];
  else
           strPsngrMobileNo = @"";
0 голосов
/ 27 января 2017

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

#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; }) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...