我们的 iOS ObjectiveC 应用程序使用的 JSON API 提要有点不稳定,因此有时字段为空。
在解析 JSON 时,我们使用
NSDictionary *json = [self JSONFromResponseObject:responseObject];
然后尝试使用这些字段,例如
[widgetIDArray addObject:widget[@"name"][@"id"]];
有时“名称”字段将为空。我们要不要:
1) 要求 API 提供者清理他们易碎的 API 代码
2) 每次我们尝试使用 json dict 中的内容时检查 null
if ( ![widget[@"name"] isKindOfClass:[NSNull class]] )
3)使用try-catch
@try {
[widgetIDArray addObject:widget[@"name"][@"id"]];
}
@catch (NSException *exception)
{
NSLog(@"Exception %@",exception);
}
回答:
谢谢楼下的回答。这是我添加的 NSObject 扩展,它允许我获取可能存在或不存在的深度嵌套的 JSON 项。
第一次调用类似的东西
self.item_logo = [self valueFromJSONWithKeyArray:event withKeyArray:@[@"categories",@"bikes",@"wheels",@"model",@"badge_uri"]];
这是 NSObject+extensions.m 中的代码
- (id) valueFromJSONWithKeyArray:(id)json withKeyArray:(NSArray *)keyArray
{
for (NSString * keyString in keyArray)
{
if ([json[keyString] isKindOfClass:[NSObject class]])
{
json = json[keyString]; // go down a level
}
else
{
return nil; // we didn't find this key
}
}
return json; // We successfully found all the keys, return the object
}
最佳答案
JSON 响应中的 null 不是“不稳定的”,它绝对是标准的。
即使它是“不稳定的”,您从外部收到的任何消息都是攻击媒介,可能允许攻击者侵入您的程序,因此需要弹性。当您收到 null 时崩溃允许对您的应用程序进行 DOS 攻击。
@try/@catch 很糟糕。为响应编程错误而引发异常。你没有捕获他们,你修复了你的代码。
你如何修复你的代码?简单的。在 NSDictionary 扩展中编写一些辅助方法。
首先你不知道 json 是一本字典。因此,您添加一个 NSDictionary 类方法,您可以在其中传递任何内容,如果它是字典,则返回您传递的内容,如果是其他任何内容,则返回 nil(带有适当的日志记录)。
接下来,您假设在“名称”键下有一个字典。因此,您编写了一个扩展名“jsonDictionaryForKey”,如果有则返回字典,如果有则返回 nil(带有适当的日志记录)。
等等。如果您想称自己为专业开发人员,请制作您的 JSON 解析防弹。对于额外的奖励积分,您添加一个方法,该方法将获取字典并列出您没有要求的所有存在的键 - 这样您就知道您的 API 是否正在发送您不期望的东西。
关于ios - 使用 Objective C 解析 JSON 的弹性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33912038/