2015-03-25 13 views
7

Ja obecnie pracuje nad aplikacją, która przywraca json, w następującym formacieJak sprawdzić, czy JSON ma wartość null w swift?

„location_subtype” = „SomeValue”; "location_type" = Wymuś; month = "2015-01"; "result_status" = { category = "somevalue"; data = "somevalue"; };

jeśli „outcome_status” ma wartość pokazuje kategorię i datę jednak jeśli „outcome_value” nie ma żadnej wartości (która jest w większości przypadków) jest pokazany poniżej

" location_subtype "=" somevalue "; "location_type" = Wymuś; month = "2015-01"; "wynik_status" = ""; "persistent_id" = "";

Pytanie, w jaki sposób mogę sprawdzić, czy wartość dla parametru wynik_status ma wartość "null"?

Próbowałem, aby zapisać kategorię i datę na etykiecie, ale wystąpił błąd, pierwsza instrukcja if powinna sprawdzić, czy wartość nie jest pusta, a jeśli nie, przejdź do następnej instrukcji if. Jednak nadal go obok if i pojawia się następujący błąd

gwintu 1: EXC_BAD_ACCESS (code = 2, address = 0x102089600)

if (dict["outcome_status"] != nil) 
     { 
      if ((dict["outcome_status"]as NSDictionary)["category"] != nil) 
      { 
       outcomeStatusLabel.text = ((dict["outcome_status"]as NSDictionary)["category"] as NSString) 
       outcomeStatusLabel.font = UIFont.systemFontOfSize(14.0); 
       outcomeStatusLabel.numberOfLines = 0 
      } 

      if ((dict["outcome_status"]as NSDictionary)["date"] != nil) 
      { 
       outcomeDateLabel.text = ((dict["outcome_status"]as NSDictionary)["date"] as NSString) 
       outcomeDateLabel.font = UIFont.systemFontOfSize(14.0); 
       outcomeDateLabel.numberOfLines = 0 
      } 
     } 

jeśli usunąć 1st if to tylko ulega awarii, gdy "result_status" = "null" i działa idealnie bez zarzutu, jeśli jest pewna wartość w "result_status"

Co muszę zrobić, aby zatrzymała się przy pierwszej instrukcji if, jeśli wartość wynosi = null?

Z góry dziękuję.

+0

@MartinR jeśli próbuję następujące 'if (dict [ "outcome_status"] jako NSString! = "") 'nadal się zawiesza. – chirag90

Odpowiedz

17

Spróbuj czegoś takiego:

Kod Swift:

if let outcome = dict["outcome_status"] as? NSDictionary { 
    //Now you know that you received a dictionary(another json doc) and is not 'nil' 
    //'outcome' is only valid inside this if statement 

    if let category = outcome["category"] as? String { 
     //Here you received string 'category' 
     outcomeStatusLabel.text = category 
     outcomeStatusLabel.font = UIFont.systemFontOfSize(14.0) 
     outcomeStatusLabel.numberOfLines = 0 
    } 

    if let date = outcome["date"] as? String { 
     //Here you received string 'date' 
     outcomeDateLabel.text = date 
     outcomeDateLabel.font = UIFont.systemFontOfSize(14.0) 
     outcomeDateLabel.numberOfLines = 0 
    } 
} 

Jest to bezpieczny sposób do pracy z JSON.

+1

Dziękujemy, działa to znakomicie, aplikacja nie zawiesza się teraz. – chirag90

+0

Awesome ... W ogóle nie obsługiwałem smutnych ścieżek, a moje aplikacje ulegały awarii na smutnej ścieżce:/ –

+0

Ten przykład działa z ciągami ... ale z innym typem nie działa. Myślę, że najlepszym rozwiązaniem jest @NunoFerro http://stackoverflow.com/a/37468020/4693765 –

0

Spróbuj odpowiadające Swift klasę do następujących klas Objective C,

dict["outcome_status"] != [NSNull null] 
6
if ((nullObject as? NSNull) == nil) { 
     ... 
     } 
-1

Uwaga - będzie działać tylko do aktualnej wartości „pustego” pochodzące z JSON, a te z nich są zamienione na NSNull przypadkach, bardziej dokładnie do wartości jednoelementowy [NSNull null] - np{"someKey":null}:

if !(parsedJSON["someKey"] is NSNull) { 
    //do your stuff 
} 

, lub alternatywnie:

if parsedJSON["someKey"] != NSNull.null() { 
    // do your stuff 
} 

lub nawet hodowca:

if let someVal = parsedJSON["someKey"] where !(someVal is NSNull) { 
    // we get here only if the key exists, and is not NSNull 
} 
+0

Brak sprawdzenia zerowego działającego w sposób szybki –

+0

@ iPhone6 ​​możesz rozwinąć ten temat ? Nie sądzę, że rozumiem. Dzięki – Cristik

+0

To nie działa szybko, otrzymuję odpowiedź od api jako "interested_in" = ""; Używana jest powyższa metoda, ale nadal ulega awarii. Dlatego powiedziałem powyżej nie działa tak szybko, że nie ma rozwiązania dla takich zer. –

Powiązane problemy