2012-09-25 27 views
18

好日子,我有一組JSONObject值,我從服務器接收並操作。大多數時候,我得到一個JSONObject的值(可以說統計),有時,它返回一個錯誤對象的代碼和錯誤的描述。現在我的問題是如何構建我的代碼,以便它不會中斷,如果它返回錯誤。我以爲我可以做到這一點,但不工作。任何幫助將不勝感激。謝謝如何測試JSONObject是否爲空或不存在

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

什麼問題在這一刻? – waqaslam

回答

8

在JSONObject中有一個'Has'方法,您可以執行以確定密鑰。

我不知道這是否可行,但看起來可信。

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

使用.has(String).isNull(String)

保守用法可能是;

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

有趣的是,我單獨使用了isNull()方法,但同樣的麻煩。 – irobotxxx

+1

發佈您使用ERROR鍵獲得的JSON消息,並提供異常類型,我們將立即對其進行排序。 :) – OceanLife

+0

你有沒有得到這個排序@sparrow? – OceanLife

2

這可能是有點晚了(這是肯定的),但發佈它未來的讀者

您可以使用JSONObject optJSONObject (String name),不會引發任何異常和

返回映射的值如果它存在並且是JSONObject,則爲名稱,否則爲null。

所以你可以做

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

,或者如果你只是想測試無效並不獲取的值,那麼

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

還有就是opt functions全家是要麼返回null或者你可以還使用重載版本使它們返回任何預定義的值。 e.g

String optString (String name, String fallback)

返回通過名稱映射的值,如果它存在,強迫它,如果必要 ,或者如果沒有這樣的映射存在回退。

其中coercing意思是,它會嘗試將該值轉換成字符串類型


的@TheMonkeyMan答案的修改版本,以消除冗餘的外觀起坐

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!"); 
    } 
}