2012-09-25 16 views
18

Dobry dzień, mam zestaw wartości JSONObject, które otrzymuję od serwera i operuję dalej. najczęściej uzyskuję JSONObject z wartością (powiedzmy statystyki), a czasami zwraca obiekt Error z kodem i opisem błędu. Teraz moje pytanie brzmi: w jaki sposób mogę ustrukturyzować mój kod tak, aby się nie zepsuł, jeśli zwróci błąd. Myślałem, że mogę to zrobić, ale nie działa. Jakakolwiek pomoc będzie doceniona. DziękiJak sprawdzić, czy JSONObject jest pusty lub nie istnieje

public void processResult(JSONObject result) { 

     try { 
      if(result.getJSONObject(ERROR) != null){ 
       JSONObject error = result.getJSONObject(ERROR); 
       String error_detail = error.getString(DESCRIPTION); 
       if(!error_detail.equals(null)){ 

            //show error login here 

       finish(); 
      } 
          else { 

      JSONObject info = result.getJSONObject(STATISTICS); 
      String stats = info.getString("production Stats")); 
      } 
         } 
+0

Siema problem w tym momencie? – waqaslam

Odpowiedz

8

W JSONObject jest metoda "Has", którą można zrobić, aby Determaine klucz.

Nie mam pojęcia, czy to zadziała, ale wygląda na wiarygodne.

public void processResult(JSONObject result) { 

    if(result.has("ERROR")) 
    { 
     JSONObject error = result.getJSONObject("ERROR") 
     String error_detail = error.getString("DESCRIPTION"); 

     if(error_detail != null) 
     { 
      //Show Error Login 
      finish(); 
     } 
    } 
    else if(result.has("STATISTICS")) 
    { 
     JSONObject info = result.getJSONObject("STATISTICS"); 
     String stats = info.getString("Production Stats"); 

     //Do something 
    } 
    else 
    { 
     throw new Exception("Could not parse JSON Object!"); 
    } 
} 
48

Zastosowanie .has(String) i .isNull(String)

Konserwatywny wykorzystanie może być;

if (record.has("my_object_name") && !record.isNull("my_object_name")) { 
     // Do something with object. 
     } 
+2

zabawny dość użyłem samej metody isNull(), ale miałem te same problemy. – irobotxxx

+1

Opublikuj otrzymany komunikat JSON za pomocą klucza ERROR i podaj typ wyjątku, a my posortujemy to w krótkim czasie. :) – OceanLife

+0

Czy dostałeś ten posortowany @sparrow? – OceanLife

2

To może być trochę za późno (to na pewno), ale umieszczenie go dla przyszłych czytelników

Można użyć JSONObject optJSONObject (String name) które nie będą rzucać żadnych wyjątków i

Zwraca wartość odwzorowaną przez nazwa, jeśli istnieje i jest JSONObject, lub null inaczej.

więc można zrobić

JSONObject obj = null; 
if((obj = result.optJSONObject("ERROR"))!=null){ 
     // it's an error , now you can fetch the error object values from obj 
} 

lub jeśli po prostu chcesz przetestować nieważność bez pobierania wartości następnie

if(result.optJSONObject("ERROR")!=null){ 
    // error object found 
} 

Istnieje cała rodzina opt functions które albo powrócić null lub można również użyj przeładowanej wersji, aby zwracać wszelkie wcześniej zdefiniowane wartości. np

String optString (String name, String fallback)

Zwraca odwzorowaną przez nazwy, jeśli istnieje, zmuszenia go, jeśli to konieczne lub awaryjne w przypadku braku takiego mapowanie istnieje.

gdzie coercing średnia, będzie starał się przekształcić w wartość typu String


Zmodyfikowana wersja odpowiedzi @TheMonkeyMan aby wyeliminować zbędne look-ups

public void processResult(JSONObject result) { 
    JSONObject obj = null; 
    if((obj = result.optJSONObject("ERROR"))!=null){ 
     //^^^^ either assign null or jsonobject to obj 
     // if not null then found error object , execute if body        
     String error_detail = obj.optString("DESCRIPTION","Something went wrong"); 
     //either show error message from server or default string as "Something went wrong" 
     finish(); // kill the current activity 
    } 
    else if((obj = result.optJSONObject("STATISTICS"))!=null){ 
     String stats = obj.optString("Production Stats"); 
     //Do something 
    } 
    else 
    { 
     throw new Exception("Could not parse JSON Object!"); 
    } 
} 
Powiązane problemy