2016-05-26 3 views
0

Der folgende Code, der entworfen wurde, um NSNull in Json-Ergebnissen abzufangen, löst eine Ausnahme aus, wenn die Antwort null ist.IOS: Erkennen von NSNull von JSON funktioniert nicht

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 
    } 

Wenn die Ausnahme auftritt, wird die Linie if (![json... beginnend in grün ist und die Fehlermeldung lautet:

 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' 

Kann jemand empfehlen, was hier falsch sein könnte?

Beachten Sie, ich habe eine Kategorie, die angeblich NSNulls in 0 verwandelt. Nicht sicher, wie dies in Wechselwirkung mit oben, aber hier ist es:

//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

Was bekommen Sie als Antwort? drucke es hier aus. Erhalten Sie leere Zeichenfolge oder null? beide sind unterschiedliche Sache – Lion

+0

Antwort = "0 (NSNull)"; – zztop

+0

Ich frage, was Sie in 'jsonResults' bekommen? – Lion

Antwort

0

Statt [jsonResults isKindOfClass:[NSNull class]] Sie einfach jsonResults == [NSNull null] tun können

1

Du bist gerade nicht, wenn responseNSNull ist. Mein Ansatz wäre zu testen, was Sie wollen, nicht das, was Sie nicht wollen:

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 
} 

In Wirklichkeit müssen Sie wissen, welche Werte sind optional und welche Werte können von unterschiedlicher Art sein, wie Sie dies nicht tun möchte das gesamte Modul mit isKindOfClass codieren.

+0

Dieser Ansatz macht Sinn so abgestimmt, aber würde eine Menge Code zu bewegen, da die // etwas haben eine Menge Sachen drin. – zztop

+0

Markierung korrekt, weil Sie darauf hingewiesen, dass ich jsonResults [@ "Antwort"] zusätzlich zu anderen zwei Ebenen überprüfen muss – zztop

+0

Ich entschuldige mich für die Markierung korrekt und die Markierung aufheben. Der Fehler tritt nur bei einem langsamen Netzwerk auf und ich dachte, es funktioniere. Aber es ist nicht. Also noch kein Problem gelöst. – zztop

1

versuchen wie diese,

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

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

     //Do your task here 
    } 

} 

Es ist, denn wenn Ihr jsonResults null ist, dann kann es nicht für [jsonResults[@"response"][@"insert_id"] überprüfen !!

Update:

if (!(jsonResults==nil)) { 

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

     //Do your task here 
    } 

} 

Keine Notwendigkeit für NSNull für jsonResults zu überprüfen. Es kann nur sein nil und Objekte enthält, dass jsonResults kann sein.

Hoffe, das wird helfen :)

+0

Ich kombinierte die beiden in if ((!) [JsonResults isKindOfClass: [NSNull-Klasse]] ||! (JsonResults == nil)) &&! [JsonResults [@ "Antwort"] [@ "insert_id"] isKindOfClass: [NSNull-Klasse ]]) {... und es schien zu funktionieren – zztop

+0

Ich kann nicht sehen, wie diese Antwort richtig ist, da 'JSONObjectWithData' ein Array, ein Wörterbuch oder' nil' und niemals 'NSNull' zurückgibt, so dass ich nicht sehe, wie das geht behebt das Problem. – trojanfoe

+0

@trojanfoe: Es kann 'NULL' sein, da Sie' jsonResults = NULL; 'in ios setzen können. und "nil" definiert auch die ID der Nullinstanz. – Lion

Verwandte Themen