检查从JSON字符串返回的Objective-C中的空值


78

我有一个来自网络服务器的JSON对象。

日志是这样的:

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

请注意,如果用户未输入电话,则电话为空。

当将此值分配给时NSString,在中显示NSLog<null>

我正在分配这样的字符串:

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

检查此<null>值的正确方法是什么?这使我无法保存NSDictionary

我一直在使用的条件尝试[myString length]myString == nilmyString == NULL

另外,在iOS文档中哪里最适合阅读此书?

Answers:


189

<null>是NSNull单例记录的方式。所以:

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

(存在单例是因为您无法添加nil到集合类。)


41
如果您想不使用演员表,也可以尝试:if ([tel isKindOfClass:[NSNull class]])
亚伦·海曼

我们可以使用:if(object isEqual:[NSNull null]){--logic here--}
Gajendra K Chauhan

24

这是演员表的示例:

if (tel == (NSString *)[NSNull null])
{
   // do logic here
}

或if(tel ==(NSString *)NSNull.null){//在这里做逻辑}
Raphael Oliveira

10

您也可以像这样检查此传入字符串:-

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

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

}

您的第一NSLog行是错误的……应该说该字符串空。在这种情况下为什么还要打印呢?
bdesham 2013年

感谢您的建议,我NSLog仅打印出知道哪种情况变为现实的照片
Nitin Gohel 2013年

9

如果要处理“不稳定”的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

最好的答案是亚伦·海曼(Aaron Hayman)在接受的答案下方发表的评论:

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

它不会产生警告:)


3

如果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

我通常这样做:

假设我有一个用于用户的数据模型,它具有一个从JSON字典获取的NSString属性,称为email。如果在应用程序内部使用了电子邮件字段,则将其转换为空字符串可以防止崩溃:

- (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:@""];
}

2

在Swift中,您可以执行以下操作:

let value: AnyObject? = xyz.objectForKey("xyz")    
if value as NSObject == NSNull() {
    // value is null
    }

问题是关于Objective-C,而不是Swift。
JasonMArcher 2014年

4
@JasonMArcher答案仍然为那些来自Google搜索的人提供了一些价值。毕竟这是一个有4年历史的问题。
新秀(Beau Nouvelle)

0

最好的做法是坚持最佳做法-即使用真实的数据模型读取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/


该JSONModel网站仍然存在吗?它不是英语的,所以我不确定,但是看起来它与JSON没有太大关系。
斯图尔特·麦克唐纳

0

我尝试了很多方法,但是没有任何效果。终于这对我有用。

NSString *usernameValue = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"usernameKey"]];

if ([usernameValue isEqual:@"(null)"])
{
     // str is null
}


0

试试这个:

if (tel == (NSString *)[NSNull null] || tel.length==0)
{
    // do logic here
}


0

如果我们得到的是空值,则可以使用下面的代码片段进行检查。

 if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]])
      strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"];
  else
           strPsngrMobileNo = @"";

-6

在这里,您还可以通过检查字符串的长度来做到这一点,即

if(tel.length==0)
{
    //do some logic here
}

3
不,如果tel是的实例NSNull,则将引发异常。
Kurt Revis

是的,我认为我们也必须检查它是否为null。我们也必须考虑上述条件
Rahul Narang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.