检查从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 == nilmyString == 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 }