2013-05-18 42 views
0

我正在使用一个使用JSON订阅源的应用程序,但发现如果订阅源不正确或缺少对象,它将导致我的应用程序崩溃。如何处理NSDictionary ObjectForKey JSON订阅源错误崩溃

这是供我们接收目前,通常是当Web服务的合作,我们将获得一个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声明

任何帮助非常感谢

感谢阿龙

回答

1

您应该测试你地图之前,它是否等于[NSNull null]

+0

谢谢,我试过,但它仍然崩溃ID SERVERID = [dictionary objectForKey:@“id”]; if(serverID!= nil && [serverID class]!= [NSNull class]){ – MonkeyBlue

0

希望这会帮助你。

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

你只需要检查id是否为null。或者您可以返回空白而不是零。那么可能它不会崩溃

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

感谢所有我觉得其实我已经解决了这个问题,我想从其中didnt在冷杉的地方存在一个关键值的答复。

将此代码添加到检查项中是否存在第一个帮助我捕获错误:

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

感谢所有帮助

亚伦

+3

这段代码是无稽之谈。首先,你应该使用objectForKey。 valueForKey与JSON数据完全不同并且非常危险。其次,你的测试当然是错误的。 !=无意味着存在。 ==零表示它不存在。 == [NSNull null]表示您的JSON文档包含空值。 – gnasher729