目标C:检查JSON值是否是您期望的类型,这是一种好习惯吗?

时间:2018-11-01 02:00:09

标签: ios objective-c json nsstring objective-c-category

当前,我正在检查JSON值是否为NSString,如果不是,请为属性分配默认字符串。这样,如果JSON值为null,我可以防止应用程序崩溃,并且可以返回具有默认名和姓的User对象。

//用户模型

+ (Email *)getEmailInfoWithDictionary:(id)dict {
  Email *email = [[self alloc] init];
  if ([dict isKindOfClass:[NSDictionary class]]) {
    user.firstname = [NSString checkType:dict[@"firstname"] defaultString:@"John"];
    user.lastname = [NSString checkType:dict[@"lastname"] defaultString:@"Smith"];
  }
}
return user;
}

// NSString类别方法。

+ (NSString *)checkType:(id)obj defaultString:(NSString *)def {
  if (obj == nil || ![obj isKindOfClass:[NSString class]]) {
    return def;
  }
  return obj;
}

但是,我有两个问题。始终检查有关json值的空值是一个好主意,这样您就不会崩溃了吗?我注意到一些不这样做的Objective C教程。让我想知道是否不应该为此担心,并且我应该期望API返回正确的值。我的第二个担心是我使用的是一个好主意的方法,还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

我想首先介绍一下Objective-C对nil的默认处理。在大多数情况下,nil会做您想要的而不会崩溃。相比之下,[NSNull null]的设计很差,是一个长期存在的问题。

@interface NSObject (MyCasting)
- (NSString *)stringOrNil;
- (NSNumber *)numberOrNil;
- (NSDictionary *)dictionaryOrNil;
- (NSArray *)arrayOrNil;
@end

@implementation NSObject (MyCasting)

- (NSString *)stringOrNil {
    return [self isKindOfClass:NSString.class] ? (NSString *)self : nil;
}

- (NSNumber *)numberOrNil {
    return [self isKindOfClass:NSNumber.class] ? (NSNumber *)self: nil;
}

- (NSDictionary *)dictionaryOrNil {
    return [self isKindOfClass:NSDictionary.class] ? (NSDictionary *)self: nil;
}

- (NSArray *)arrayOrNil {
    return [self isKindOfClass:NSArray.class] ? (NSArray *)self: nil;
}

@end

使用nil作为默认值将为您提供良好的安全性。

+ (Email *)getEmailInfoWithDictionary:(id)dict {
    Email *email = [[self alloc] init];
    NSDictionary *dictionary = [dict dictionaryOrNil];

    email.firstname = [dictionary[@"firstname"] stringOrNil];
    email.lastname = [dictionary[@"lastname"] stringOrNil];

    return email;
}

如果您认为需要额外的对象默认值安全性,则可以使用?:运算符。

email.firstname = [dictionary[@"firstname"] stringOrNil] ?: "";
email.lastname = [dictionary[@"lastname"] stringOrNil] ?: "";

答案 1 :(得分:1)

  

始终检查有关json值的空值是一个好主意,这样您就不会崩溃了吗?

     

让我想知道我是否不必为此担心,我应该期望API返回正确的值。

是的,绝对是个好主意。永远不要假设您从第三者那里获得的数据将是您所期望的。 API更改。发生错误。每当您处理控件中非100%的数据时,都要进行防御性代码编码。比起应用崩溃,比向应用程序崩溃更容易向用户显示错误或处理意外数据,因为您期望一个字符串并得到一个数字,或者只有一个字典而不是字典数组,等等。

  

我的第二个担忧是我使用的是一个好主意的方法,还是有更好的方法?

这里没有好的答案。每个用例都是不同的。处理不良数据的方式取决于数据及其严重程度。对于简单的情况(例如名称丢失或无效),提供默认值可能合适,也可能不合适。这取决于您和您的应用程序。最好跳过记录或向用户显示错误。或者,如果您的情况合适,则选择默认为某个值就可以了。