2013-10-07 125 views
3

我想解析JSON,但每次獲得值時,都必須將該指令放入try-catch塊。這裏是一個例子:解析JSON,沒有TryCatch塊的繼承

try { 
     this.setID(jsonObject.getLong("id")); 
    } catch (JSONException e) { 
    } 
    try { 
     this.setName(jsonObject.getString("name")); 
    } catch (JSONException e) { 
    } 
//and so on.... 

我不在乎指令是否出現異常。所以我想知道是否可以刪除所有的try-catch塊並把所有的指令放在一起。

其實它更是一個java的問題,不僅是一個Android問題....

編輯

只是澄清什麼問題。 當發生異常是因爲我沒有找到標籤時,我會繼續進行下一個標籤檢查,而不是處理異常。要做到這一點,我必須按照上面所述的方式編寫代碼,從而實現一系列try-catch塊。我正在尋找更快(更優雅)的解決方案。

+0

Gson是一個Java庫,可用於將Java對象轉換爲其JSON表示形式。它也可以用來將JSON字符串轉換爲等效的Java。 參考: http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html – jittakal

+0

一個好的代碼應該有try-catch塊正確處理,而不是避免它。 – Piyush

回答

9

您可以使用opt方法而不是get方法,假設密鑰不存在。如果密鑰不是可選的,並且您的應用無法從那些不是全部的字段中恢復,那麼您肯定應該使用get方法,並且如果遇到錯誤則會快速失敗。

另一種有用的方法是has()方法。這將檢查給定密鑰是否存在映射。 (例如if (json.has("id") id = json.optString("id")))。

+0

正是我在找什麼。謝謝 –

8

也許我不明白你在問什麼,但你爲什麼不把所有調用jsonObject放在同一個try-catch塊中?

try { 
    this.setID(jsonObject.getLong("id")); 
    this.setName(jsonObject.getString("name")); 
} catch (JSONException e) { 
} 

你應該從未剛嚥下例外。至少記錄一個錯誤。

+2

您也可以使用'opt'方法而不是'get'方法。如果無法檢索該值,這些將返回默認值,並且不會引發異常。但是,只有在可接受的情況下才會使用這個值,否則您應該處理特殊情況。 – kcoppock

+0

@Sotirios是的,但在第一個異常將停止解析json。 –

+0

@kcoppock好的謝謝!我不知道這個功能。如果你把它作爲答案,我可以接受:) –

1

就像@Sotirios在說你不能忽視json異常。

你可以把一個方法,你的所有的JSON的閱讀,使該方法拋出JSONException,就像這樣:

public void readJson(String json) throws JSONException{ 
    this.setID(jsonObject.getLong("id")); 
    this.setName(jsonObject.getString("name")); 
    } 

但鋼有,當你調用這個方法做一個嘗試捕捉:

try { 
      readJson(jLine); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
+0

也許我不清楚。我的意思是,當出現異常時,因爲沒有我正在尋找的標籤,我將繼續進行下一個標籤檢查,而不是處理異常。要做到這一點,我必須在上面發佈代碼時編寫代碼,但我會繼續嘗試catch塊。我正在尋找更快(更優雅)的解決方案,就像@ kcoppock的解決方案一樣。希望現在更好:) –

0

我認爲這比其他任何問題都更像一個圖書館問題。 Java中的幾個JSON庫傾向於在其庫調用中添加異常,就好像設計人員想要使用侵入性的類似於C的錯誤狀態代碼一樣,但增加了Java異常語法的權重。我可以部分理解這種界面的動機,但看起來確實不夠雅緻。

我會建議使用json-simple,這有時候太簡單了,但會完成工作並保持不變。

+0

我同意你的想法。然而,使用opt方法,這是一個很好(和優雅)的替代:) –

0

更換

jsonObject.getFoo("key") 

jsonObject.optFoo("key") 

如果找不到鍵,返回而不是拋出一個異常null或類似的默認值。

0

如果你想要更清晰的語法,你應該看看gson。如果你知道json會是什麼樣子,沒有什麼比它好。

如果你的JSON看起來是這樣的:

{ 
    "id": 432942039, 
    "name": "My name", 
    "values": [0, 1, 2, 3] 
} 

你會創建一個POJO類,看起來像這樣:

public class MyClass { 
    public MyClass() {} 
    private long id; 
    private String name; 
    private int[] values; 
} 

並解析它是這樣的:

private parse(String jsonString) { 
    Gson gson = new Gson(); 
    MyClass myObject = gson.fromJson(jsonString, MyClass.class); 
} 

就是這樣。不需要安裝程序;它使用反射來匹配字段。沒有註釋。如果JSON字符串中的字段與您的POJO中的任何內容不匹配,則不會發生錯誤,反之亦然。