Ответ 1
<null>
- это то, как записывается однострочный журнал NSNull. Итак:
if (tel == (id)[NSNull null]) {
// tel is null
}
(Singleton существует, потому что вы не можете добавить nil
в классы коллекции.)
У меня есть объект JSON, который поступает с веб-сервера.
Журнал выглядит примерно так:
{
"status":"success",
"UserID":15,
"Name":"John",
"DisplayName":"John",
"Surname":"Smith",
"Email":"email",
"Telephone":null,
"FullAccount":"true"
}
Обратите внимание, что телефон входит в число "null", если пользователь не вводит его.
При присвоении этого значения a NSString
, в NSLog
он выйдет как <null>
Я назначаю строку следующим образом:
NSString *tel = [jsonDictionary valueForKey:@"Telephone"];
Каков правильный способ проверить это значение <null>
? Это мешает мне сохранить NSDictionary
.
Я попытался использовать условия [myString length]
и myString == nil
и myString == NULL
Кроме того, где лучше всего читать документацию iOS?
<null>
- это то, как записывается однострочный журнал NSNull. Итак:
if (tel == (id)[NSNull null]) {
// tel is null
}
(Singleton существует, потому что вы не можете добавить 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, называемое электронной почтой, полученное из 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] в * nil * значения, так что вы могли бы выполнять свои проверки, как обычно, в 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/
Попробуйте следующее:
if (tel == (NSString *)[NSNull null] || tel.length==0)
{
// do logic here
}
Я пробовал много методов, но ничего не получилось. Наконец, это сработало для меня.
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
}
Я использую это:
#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 = @"";
Здесь вы также можете сделать это, проверив длину строки i.e.
if(tel.length==0)
{
//do some logic here
}