0

我正在开发一个使用 JSON 提要的应用程序,但发现如果提要不正确或缺少对象,它将导致我的应用程序崩溃。

这是我们目前正在接收的提要,通常当网络服务工作时,我们会收到一个 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 语句

任何帮助将非常感激

谢谢亚伦

4

4 回答 4

2

you just have to check id, whether it is null or not. or you can return blank in place of nil. then may be it wont crash

- (id)objectForKeyOrNil:(id)key {
    id val = [self objectForKey:key];
    if (val ==[NSNull null]) 
    {
        return nil;
    }
    return val;
 }
于 2013-05-18T10:22:28.540 回答
1

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

于 2013-05-18T10:14:35.827 回答
0

希望这会帮助你。

- (id)objectForKeyOrNil:(id)akey {
    id object = [self objectForKey:aKey];
    if (object == nil ) {
        return @"";
    }
    if ([object isKindOfClass:[NSString class]) {
        return object;
    } else {
        return nil;
    }
}
于 2013-05-18T10:17:02.130 回答
-3

感谢所有回复,我认为我实际上已经解决了它我试图从一个最初不存在的键中获取值。

添加此代码以首先检查密钥是否存在帮助我捕获错误:

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

感谢所有的帮助

亚伦

于 2013-05-18T10:42:08.093 回答