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

我有一个 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 文档中哪里是阅读这些内容的最佳位置?

70535 次浏览

<null>是 NSNull 单实例如何记录的,因此:

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

(存在单例是因为不能将 nil添加到集合类中。)

下面是演员阵容的例子:

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

在这里,您还可以通过检查字符串的长度即。

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

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

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


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


}

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

如果您正在处理一个“不稳定”的 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

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

最佳答案是亚伦•海曼(Aaron Hayman)在以下公认答案中的评论:

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

它不会发出警告:)

我通常是这样做的:

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

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

试试这个:

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

在 Swift 中,你可以做到:

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

我试了很多方法,但都没用。 我终于成功了。

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 = @"";