8

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 ブロックが必要です。より高速な (そしてよりエレガントな) ソリューションを探していました。

4

6 に答える 6

16

キーが存在しなくても問題ないと仮定して、optメソッドの代わりにメソッドを使用できます。getキーがオプションではなく、すべてが存在しないフィールドからアプリが回復できない場合は、間違いなくgetメソッドを使用し、エラーが発生した場合はすぐに失敗する必要があります。

使用できるもう 1 つの便利な方法は、has()メソッドです。これは、特定のキーのマッピングがあるかどうかを確認します。(例if (json.has("id") id = json.optString("id")))。

于 2013-10-07T18:29:51.510 に答える
9

あなたが何を求めているのか理解できなかったかもしれませんが、すべての呼び出しをjsonObject同じ try-catch ブロック内に配置しないのはなぜですか?

try {
    this.setID(jsonObject.getLong("id"));
    this.setName(jsonObject.getString("name"));
} catch (JSONException e) {
    // log or consume it some other way
}

例外を単に飲み込むべきではありません。少なくともエラーを記録します。

于 2013-10-07T17:48:08.913 に答える
0

交換

jsonObject.getFoo("key")

jsonObject.optFoo("key")

キーが見つからない場合、null例外がスローされる代わりに、または同様のデフォルト値が返されます。

于 2013-10-07T18:29:25.600 に答える
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 のどのフィールドとも一致しないフィールドが含まれていても、エラーは発生しません。

于 2013-10-07T20:24:34.173 に答える