Ios 目标C:如果JSON值是您期望的类型,那么检查JSON值是否是一种良好的做法?

Ios 目标C:如果JSON值是您期望的类型,那么检查JSON值是否是一种良好的做法?,ios,objective-c,json,nsstring,objective-c-category,Ios,Objective C,Json,Nsstring,Objective C Category,目前,我正在检查JSON值是否为NSString,如果不是,则为属性指定一个默认字符串。这样,如果JSON值为null,我就可以防止应用程序崩溃,并且我可以返回一个带有默认名字和姓氏的用户对象 //用户模型 + (Email *)getEmailInfoWithDictionary:(id)dict { Email *email = [[self alloc] init]; if ([dict isKindOfClass:[NSDictionary class]]) { user

目前,我正在检查JSON值是否为
NSString
,如果不是,则为属性指定一个默认字符串。这样,如果JSON值为
null
,我就可以防止应用程序崩溃,并且我可以返回一个带有默认名字和姓氏的用户对象

//用户模型

+ (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返回正确的值。我的第二个担忧是我正在使用的方法是一个好主意还是有更好的方法?

我想说,从学习Objective-C默认处理
nil
开始。在大多数情况下,
nil
将执行您想要的操作而不会崩溃。相比之下,
[NSNull]
的设计很差,是一个长期存在的问题

@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] ?: "";
总是检查关于json值的空值是否是一个好主意,这样您就不会崩溃

这让我想知道我是否不应该担心这个问题,我应该期望API返回正确的值

是的,检查一下绝对是个好主意。永远不要假设您从第三方获得的数据是您所期望的。API改变了。虫子会发生。无论何时处理并非100%在您控制范围内的数据,都要进行防御性编码。最好是向用户显示错误或以某种优雅的方式处理意外数据,而不是让你的应用程序崩溃,因为你需要一个字符串和一个数字,或者你只有一个字典而不是一个字典数组,等等

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

这里没有好的答案。每个用例都是不同的。如何处理坏数据取决于数据及其坏的程度。对于缺少或无效名称这样的简单情况,提供默认名称可能是合适的,也可能是不合适的。这取决于你和你的应用程序。最好跳过记录或向用户显示错误。或者,如果对您的情况有意义的话,您可以选择默认某个值