Проверка нулевого значения в 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 ответов:
<null>
как NSNull синглтон журналы. Итак:if (tel == (id)[NSNull null]) { // tel is null }
(одноэлементный существует, потому что вы не можете добавить
nil
для сбора классов.)
вы также можете проверить эту входящую строку следующим образом: -
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 }
Я использую этот:
#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; })