检查从JSONstring返回的Objective-C中的空值
我有一个来自Web服务器的JSON对象。
日志是这样的:
{ "status":"success", "UserID":15, "Name":"John", "DisplayName":"John", "Surname":"Smith", "Email":"email", "Telephone":null, "FullAccount":"true" }
注意,如果用户没有input电话,则电话进入空。
当把这个值NSString
一个NSString
,在NSLog
它会以<null>
我正在像这样分配string:
NSString *tel = [jsonDictionary valueForKey:@"Telephone"];
什么是检查这个<null>
值的正确方法? 这是防止我保存一个NSDictionary
。
我已经尝试使用条件[myString length]
和myString == nil
和myString == NULL
另外,iOS文档中的最佳位置是在哪里阅读的?
<null>
是NSNull单例logging的方式。 所以:
if (tel == (id)[NSNull null]) { // tel is null }
(单例存在,因为您不能将集合类添加到nil
)。
这里是演员的例子:
if (tel == (NSString *)[NSNull null]) { // do logic here }
你也可以这样检查这个传入的string: –
if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""]) { NSlog(@"Print check log"); } else { NSlog(@Printcheck log %@",tel); }
如果你正在处理一个“不稳定的”API,你可能想遍历所有的键来检查null。 我创build了一个类来处理这个问题:
@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
如果你在json中有很多属性,用if
语句逐个检查它们是很麻烦的。 更糟糕的是,代码会很难维护。
我认为更好的方法是创build一个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];
最好的答案是Aaron Hayman在接受的答案下面评论:
if ([tel isKindOfClass:[NSNull class]])
它不会产生警告:)
我通常这样做:
Assuma我有一个用户的数据模型,它有一个名为email的NSString属性,从JSON字典中获取。 如果在应用程序中使用电子邮件字段,则将其转换为空string可防止可能的崩溃:
- (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
以下是创build基于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 = @"";
在这里,你也可以通过检查string的长度来做到这一点
if(tel.length==0) { //do some logic here }