2013-04-20 10 views
11

Używam usługi internetowej, która zwraca JSON. Jedną z wartości, które otrzymuję, jest "<null>".ios: porównaj NSString do "<null>" nie działa

Po uruchomieniu poniższego kodu, jeśli instrukcja nadal jest wykonywana, gdy nie jest ona przewidziana.

Każdy powód dlaczego?

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 
} 

Odpowiedz

30

jestem zużywa usługi sieci web, która zwraca JSON. Jedną z wartości, które otrzymuję, jest "< null>"

Aha. Dwie możliwości:

I. JSON nie zawiera informacji o długości i szerokości geograficznej. W takim przypadku klucze do nich nie występują w słowniku, który otrzymujesz, więc w rzeczywistości uzyskujesz wskaźnik nil (lub NULL). Ponieważ komunikat nil zwraca zero, oba warunki zostaną uruchomione (z powodu zastosowanej negacji). Spróbuj to zamiast:

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

i nigdy polegać na opisie przedmiotu.

II. Prawdopodobnie JSON zawiera wartości null, a analizator składni JSON, którego używasz, zmienia się na null w [NSNull null], a następnie próbujesz porównać ciąg z tym NSNull. W tym przypadku, spróbuj tego:

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

*** Jaki jest powód upadku? *** –

+0

+1 Idealne rozwiązanie. – Anupdas

+1

Tak! Druga odpowiedź, którą mi dałeś, zadziałała. Dziękuję Ci. – wwjdm

0

Zazwyczaj, jeśli uzyska wartość null w odpowiedzi JSON, trzeba sprawdzić przed NSNull.

W twoim przypadku, należy zrobić coś takiego:

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

Proszę nie porównywać obiektów za pomocą '=='. –

+1

"Aby przetestować wartość obiektu zerowego, musisz dokonać bezpośredniego porównania obiektów." - Prosto z dokumentacji Apple. Dokonują bezpośredniego porównania obiektów używając == przed użyciem isEqual. https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html –

+0

@ H2CO3 - Prawie nigdy nie porównuję obiektów używających == poza tym przypadkiem ... chyba że jest dokumentacja Apple'a źle. –

2

miałem ten sam problem, ale rozwiązany jak poniżej, zastąpić jeśli z następujących,

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

To też działa! – wwjdm

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

ten jest to, co zrobię. To dlatego, że muszę przechowywać wartość, nawet jeśli zwracana jest wartość null.