如何处理NSDictionary ObjectForKey JSON提要错误崩溃

时间:2013-05-18 10:12:46

标签: ios objective-c json nsdictionary

我正在开发一个使用JSON Feed的应用,但发现如果Feed不正确或缺少对象,则会导致我的应用崩溃。

这是我们当前收到的Feed,通常在网络服务正常时我们会收到ID

    result =     {
        data =         {
            result =             (
                "<null>"
            );
        };
        success = 1;
    };
}:

我目前正在解析像这样的

NSDictionary *results = [json objectForKeyOrNil:@"result"];
NSString *success = [results objectForKeyOrNil:@"success"];
NSDictionary *data = [results objectForKeyOrNil:@"data"];
NSDictionary *resultsArray = [data objectForKeyOrNil:@"result"];

最后我们这样做是为了尝试获取缺少的对象

NSString *test = [dictionary objectForKeyOrNil:@"id"];

此时应用程序崩溃

我正在使用objectForKeyOrNil的类别类我希望能防止崩溃,但这似乎也无效。

- (id)objectForKeyOrNil:(id)key {
    id val = [self objectForKey:key];
    if ([val isEqual:[NSNull null]]) {
        return nil;
    }

    return val;
}

收到崩溃讯息 - [NSNull objectForKeyOrNil:]:无法识别的选择器发送到实例0x248e678

我以为我会在这里更新原帖,有些人建议在我执行此操作时检查ID仍然会崩溃

NSDictionary *resultsArray = [data objectForKeyOrNil:@"result"];
// Loop through the downloaded data
for (NSDictionary *dictionary in resultsArray) {

    id val = [dictionary objectForKey:@"id"];
    if ([val isEqual:[NSNull null]] || val==nil) {
    }

    NSLog(@"Should be OK");

使用上面的代码,它永远不会到达NSLog语句

非常感谢任何帮助

谢谢Aaron

4 个答案:

答案 0 :(得分:2)

你只需检查id,它是否为null。或者你可以返回空白代替零。然后可能它不会崩溃

- (id)objectForKeyOrNil:(id)key {
    id val = [self objectForKey:key];
    if (val ==[NSNull null]) 
    {
        return nil;
    }
    return val;
 }

答案 1 :(得分:1)

在映射之前,您应该测试它是否等于[NSNull null]

答案 2 :(得分:0)

希望这会对你有所帮助。

- (id)objectForKeyOrNil:(id)akey {
    id object = [self objectForKey:aKey];
    if (object == nil ) {
        return @"";
    }
    if ([object isKindOfClass:[NSString class]) {
        return object;
    } else {
        return nil;
    }
}

答案 3 :(得分:-3)

感谢所有回复我认为我实际上已经解决了这个问题我试图从第一个没有存在的密钥中获取价值。

添加此代码以检查密钥是否存在,这有助于我捕获错误:

    if ([dictionary valueForKey:@"id"] != nil) {
        NSLog(@"Key does not exist");
    }

感谢所有帮助

亚伦