2009-11-27 5 views
0

Я разбираю файл JSON.NSNull crashes my initWithDictionary

После получения NSDictionary я разбираю объекты в словаре в виде массива объектов. Однако для некоторых JSON файлов, я получаю NULL, который должен быть в порядке, но он выходит из строя моего приложения для тех, кто там, где я ожидал что-то, но получать нуль:

- (id)initWithDictionary:(NSDictionary *)boxDictionary { 
if ([self init]) { 
    // ... 
    int numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue]; 
    int numberOfItemsInBoxes = [[boxDictionary valueForKey:@"box_items_count"] intValue]; 
     // .. 
} 
return self; 
} 

ответ

4

Основная проблема, кажется, не в том, что нет метод intValue в NSNull, который вы возвращаете из вызова valueForKey :.

Вы можете добавить метод intValue, но что бы вы получили его для NSNull? 0? -1?

Код для этого будет выглядеть примерно так.

В MyNullExtensions.h:

@interface NSNull (integer) 
-(int) intValue; 
@end 

И в MyNullExtensions.m:

#import "MyNullExtensions.h" 

@implementation NSNull (functional) 
-(int) intValue 
{ 
    return -1; 
} 
@end 

Позже Блейк.

+0

Спасибо. Работал! Вы умны, кто-то вроде Google или Mozilla должен нанять вас. – runmad

0

int не может быть nil, так intValue не имеет какой-либо способ, чтобы сказать вам, что это не может получить intValue в виде nil объекта. Вам нужно проверить, есть ли у вас объект, возвращенный с valueForKey:, прежде чем вы попросите его intValue.

if ([boxDictionary valueForKey:@"box_count"]) 
    numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue]; 
0

Просто выполните простой тест против NSNull, прежде чем вы вызовете intValue. Не нужно расширять объект NSNull.

if ([rate valueForKey:@"value"]!=[NSNull alloc]) { 

    // put your code here 

}