ios - 使用 Objective C 解析 JSON 的弹性

标签 ios objective-c iphone json

我们的 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/

相关文章:

ios - "absolute position" ScrollView 内的 View

objective-c - 恢复上一个 View 及其 subview

iphone - 带有矩阵 View 的 UITableView

iphone - 如何阻止键盘在 iOS 上阻止外部通知的关闭按钮?

ios - 这是 IOS 中 CoreData 应用程序的良好设计吗?

ios - 在 iOS 中打开文档的 iCloud 错误

ios - 以 10 为基数的 NSData

iphone - 单个屏幕中的多个 TableView

iPhone .htaccess 重定向循环

ios - 无法使用 XCode 8 将 UIView 上方的 UIScrollView 插入到另一个场景