Objective C:检查 JSON 值是否是您期望的类型是一种好习惯吗?
Objective C: Is it good practice to check JSON values if it is the type you expect?
目前,我正在检查 JSON 值是否为 NSString
,如果不是,则为 属性 分配一个默认字符串。这样,如果 JSON 值为 null
,我可以防止应用程序崩溃,并且我可以 return 具有默认名字和姓氏的用户对象。
// 用户模型
+ (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 到 return 正确的值。我的第二个问题是我使用的方法是个好主意还是有更好的方法?
我想说的是先了解 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] ?: "";
Is it a good idea to always check for null values regarding json values so this way you won't get crashes?
Makes me wonder if I shouldn't worry about this and I should expect the API to return the correct values.
是的,检查一下绝对是个好主意。永远不要假设您从第三方获得的数据会是您所期望的。 API 发生变化。错误发生。每当您处理并非 100% 受您控制的数据时,请采取防御性编码。最好向用户显示错误或以某种优雅的方式处理意外数据,而不是让你的应用程序崩溃,因为你期望一个字符串并得到一个数字,或者你得到一个字典而不是一个字典数组等。
My second concern is the method I am using a good idea or is a there better way?
这里没有好的答案。每个用例都是不同的。您如何处理不良数据取决于数据及其不良程度。对于像缺少或无效名称这样的简单情况,提供默认值可能合适也可能不合适。这取决于您和您的应用程序。跳过记录或向用户显示错误可能更好。或者,如果这对您的情况有意义,您可以选择默认某个值。
目前,我正在检查 JSON 值是否为 NSString
,如果不是,则为 属性 分配一个默认字符串。这样,如果 JSON 值为 null
,我可以防止应用程序崩溃,并且我可以 return 具有默认名字和姓氏的用户对象。
// 用户模型
+ (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 到 return 正确的值。我的第二个问题是我使用的方法是个好主意还是有更好的方法?
我想说的是先了解 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] ?: "";
Is it a good idea to always check for null values regarding json values so this way you won't get crashes?
Makes me wonder if I shouldn't worry about this and I should expect the API to return the correct values.
是的,检查一下绝对是个好主意。永远不要假设您从第三方获得的数据会是您所期望的。 API 发生变化。错误发生。每当您处理并非 100% 受您控制的数据时,请采取防御性编码。最好向用户显示错误或以某种优雅的方式处理意外数据,而不是让你的应用程序崩溃,因为你期望一个字符串并得到一个数字,或者你得到一个字典而不是一个字典数组等。
My second concern is the method I am using a good idea or is a there better way?
这里没有好的答案。每个用例都是不同的。您如何处理不良数据取决于数据及其不良程度。对于像缺少或无效名称这样的简单情况,提供默认值可能合适也可能不合适。这取决于您和您的应用程序。跳过记录或向用户显示错误可能更好。或者,如果这对您的情况有意义,您可以选择默认某个值。