[英]Parse JSON without succession of Try-Catch blocks
我想解析一個JSON,但每次得到一個值時,我都必須把指令放在try-catch塊中。 這是一個例子:
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塊。 我一直在尋找更快(更優雅)的解決方案。
您可以使用opt
方法而不是get
方法,假設密鑰不存在是可以的。 如果密鑰不是可選的,並且您的應用程序無法從那些並非全部存在的字段中恢復,那么您肯定應該使用get
方法並在遇到錯誤時快速失敗。
您可以使用的另一個有用的方法是has()
方法。 這將檢查是否存在給定鍵的映射。 (例如if (json.has("id") id = json.optString("id"))
)。
也許我不明白你在問什么,但為什么不把所有調用都jsonObject
同一個try-catch塊中的jsonObject
?
try {
this.setID(jsonObject.getLong("id"));
this.setName(jsonObject.getString("name"));
} catch (JSONException e) {
// log or consume it some other way
}
你永遠不應該只是吞下例外。 至少記錄一個錯誤。
就像@Sotirios說的那樣,你不能忽視一個json異常。
您可以將所有json讀取放在方法中,並使該方法拋出JSONException,如下所示:
public void readJson(String json) throws JSONException{
this.setID(jsonObject.getLong("id"));
this.setName(jsonObject.getString("name"));
}
但是當你調用那個方法時,你必須做一個try catch:
try {
readJson(jLine);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我認為它更像是一個庫問題而不是其他任何問題。 Java中的一些JSON庫傾向於在其庫調用中添加異常,就像設計者想要使用類似入侵C的錯誤狀態代碼一樣,但增加了Java異常語法的權重。 我可以部分理解這種界面的動機,但看起來真的很不優雅。
我建議使用json-simple ,這有時候太簡單了,但是完成工作並且不受影響。
更換
jsonObject.getFoo("key")
同
jsonObject.optFoo("key")
如果未找到該鍵,則返回null
或類似的默認值,而不是拋出異常。
如果你想要更清晰的語法,你應該看看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中的任何字段不匹配,則無錯誤,反之亦然。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.