2016-05-26 10 views
0

Следующий код, предназначенный для поиска результатов NSNull в Json, генерирует исключение, когда ответ равен NULL.IOS: обнаружение NSNull от JSON не работает

NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
    NSLog(@"jsonResults are:%@",jsonResults); 
       if (![jsonResults isKindOfClass:[NSNull class]]&&! 
[jsonResults[@"response"][@"insert_id"]isKindOfClass:[NSNull class]]&&! 
(jsonResults==nil)){ 
    //do something 
    } 

Когда происходит исключение, линия начала if (![json... в зеленый цвет и сообщение об ошибке гласит:

 Results: { 
     code = 400; 
     response = "0(NSNull)"; 
    } 
    2016-05-26 07:18:06.327 idaru[385:60b] -[NSNull 
objectForKeyedSubscript:]: unrecognized selector sent to instance 
0x38871a70 
    2016-05-26 07:18:06.329 myapp[385:60b] *** Terminating app due to 
uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull 
objectForKeyedSubscript:]: unrecognized selector sent to instance 
0x38871a70' 

Можно ли предположить, что может быть не так?

Обратите внимание: у меня есть категория, которая якобы преобразует NSNulls в 0s. Не знаю, как это взаимодействует с выше, но здесь это:

//NSNull+JSON.m 
@implementation NSNull (JSON) 

- (NSUInteger)length { return 0; } 

- (NSInteger)integerValue { return 0; }; 

- (float)floatValue { return 0; }; 

- (NSString *)description { return @"0(NSNull)"; } 

- (NSArray *)componentsSeparatedByString:(NSString *)separator { return @[]; } 

- (id)objectForKey:(id)key { return nil; } 

- (BOOL)boolValue { return NO; } 

@end 
+0

Что вы получите в ответ? напечатайте его здесь. Вы получаете пустую строку или null? обе разные вещи – Lion

+0

response = "0 (NSNull)"; – zztop

+0

Я спрашиваю, что вы получаете в 'jsonResults'? – Lion

ответ

0

Вместо [jsonResults isKindOfClass:[NSNull class]] вы можете просто сделать jsonResults == [NSNull null]

1

Вы не проверять, если response является NSNull. Мой подход должен был бы проверить, что вы хотите, а не то, что вы не хотите:

NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
if (jsonResults) { // This won't be NSNull, it will be nil on error 
    NSDictionary *response = jsonResults[@"response"]; 
    if ([response isKindOfClass:[NSDictionary class]]) { 
     NSNumber *insertId = response[@"insert_id"]; // Assumption 
     if ([insertId isKindOfClass:[NSNumber class]]) { 
      // Print value 
     } 
    } 
} else { 
    // Report error 
} 

В реальности вы должны знать, какие значения являются необязательными и какие значения могут быть разных типов, так как вы не хотите закодировать весь модуль, используя isKindOfClass.

+0

Этот подход имеет смысл, поэтому голосование проголосовало, но потребовалось бы переместить много кода, поскольку // делает что-то в нем много чего. – zztop

+0

правильная маркировка, потому что вы указали, что мне нужно проверить jsonResults [@ "response"] в дополнение к другим двум уровням – zztop

+0

Приношу свои извинения за правильность маркировки и разметку. Ошибка только с медленной сетью, и я думал, что она работает. Но это не так. Так что еще не решили проблему. – zztop

1

попробовать, как это,

if (![jsonResults isKindOfClass:[NSNull class]] || !(jsonResults==nil)) { 

    if (![jsonResults[@"response"][@"insert_id"]isKindOfClass:[NSNull class]]) { 

     //Do your task here 
    } 

} 

Это происходит потому, что если ваш jsonResults равно нулю, то он не может проверить [jsonResults[@"response"][@"insert_id"] !!

Update:

if (!(jsonResults==nil)) { 

    if (![jsonResults[@"response"][@"insert_id"]isKindOfClass:[NSNull class]]) { 

     //Do your task here 
    } 

} 

Нет необходимости проверять NSNull для jsonResults. Это может быть только nil, и в нем содержатся объекты jsonResults может быть NSNull.

Надеюсь, это поможет :)

+0

Я объединил их в if ((! [JsonResults isKindOfClass: [NSNull class]] ||! (JsonResults == nil)) &&! [JsonResults [@ "response"] [@ "insert_id"] isKindOfClass: [NSNull class ]]) {... и, похоже, работает – zztop

+0

Я не вижу, как этот ответ прав, так как 'JSONObjectWithData' вернет массив, словарь или' nil' и никогда 'NSNull', поэтому я не вижу, как это исправляет проблему. – trojanfoe

+0

@trojanfoe: это может быть 'NULL', поскольку вы можете установить' jsonResults = NULL; 'в ios. и 'nil' также определяет идентификатор нулевого экземпляра. – Lion