簡體   English   中英

在沒有連續Try-Catch塊的情況下解析JSON

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM