2013-04-20 16 views
11

Ich verwende einen Webdienst, der JSON zurückgibt. Einer der Werte, die ich bekomme, ist "<null>".ios: NSString mit "<null>" vergleichen funktioniert nicht

Wenn ich den folgenden Code ausführe, wird die Anweisung if immer noch ausgeführt, wenn sie nicht unterstützt wird.

Gründe warum?

NSDictionary *location = [dictionary valueForKey:@"geoLocation"];  //get the product name 
NSString *latitude = [location valueForKey:@"latitude"]; 
NSLog(@"%@", latitude); 

NSString *longitude = [location valueForKey:@"longitude"]; 

if (![latitude isEqual: @"<null>"] && ![longitude isEqual: @"<null>"]) { 
    NSLog(@"%d", i); 
    CLLocationCoordinate2D coordinate; 
    coordinate.longitude = [latitude doubleValue]; 
    coordinate.longitude = [longitude doubleValue]; 
    [self buildMarketsList:coordinate title:title subtitle:nil]; //build the browse list product 
} 

Antwort

30

Ich raubend einen Web-Service, die JSON zurückgibt. Einer der Werte, die ich erhalte, ist "< null>"

Aha. Zwei Möglichkeiten:

I. Der JSON enthält keine Breiten- und Längeninformationen. In diesem Fall sind die Schlüssel für sie in dem Wörterbuch, das Sie zurück erhalten, nicht vorhanden, so dass Sie tatsächlich einen Zeiger nil (oder NULL) erhalten. Da die Nachricht nil null zurückgibt, werden beide Bedingungen ausgelöst (aufgrund der angewendeten Negation). Versuchen Sie stattdessen:

if (latitude != nil && longitude != nil) 

und nie verlassen sich auf die Beschreibung eines Objekts.

II. Wahrscheinlich enthält der JSON null Werte, und der JSON-Parser, den Sie verwenden, verwandelt sich in null in [NSNull null], und Sie versuchen wiederum, eine Zeichenfolge mit dieser zu vergleichen. wenn Sie in einer JSON-Antwort null zu bekommen, werden Sie müssen überprüfen gegen NSNull

if (![latitude isEqual:[NSNull null]] && ![longitude isEqual:[NSNull null]]) 
+1

*** Was ist der Grund für den Downvote? *** –

+0

+1 Perfekte Lösung. – Anupdas

+1

Ja! Die zweite Antwort, die du mir gegeben hast, hat funktioniert. Vielen Dank. – wwjdm

0

Regel: In diesem Fall versuchen Sie dies.

In Ihrem Fall sollten Sie etwas tun:

if ([location valueForKey:@"longitude"] == [NSNull null]) { 
    // is null object 
} 
+2

Bitte vergleichen Sie keine Objekte mit '=='. –

+1

"Um auf einen Null-Objektwert zu testen, müssen Sie daher einen direkten Objektvergleich durchführen." - Direkt aus Apples Dokumentation. Sie machen einen direkten Objektvergleich mit == vor der Verwendung von isEqual. https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html –

+0

@ H2CO3 - Ich vergleiche fast nie Objekte mit == außer diesem Fall ... es sei denn, die Dokumentation von Apple ist falsch. –

2

Ich hatte dasselbe Problem, aber wie unten gelöst, Ersetzen Sie, wenn mit folgenden,

if (![latitude isKindOfClass:[NSNull class]] && ![longitude isKindOfClass:[NSNull class]]) 
+0

Das funktioniert auch! – wwjdm

0
if ([latitude isEqual:[NSNull null]]) 
{ 
//do something 
latitude = @""; 
} 
else 
{ 
//do something else 
latitude = json value 
} 

Diese ist was ich tun werde. Dies liegt daran, dass ich den Wert speichern muss, selbst wenn eine Null zurückgibt.

Verwandte Themen