1

私はJSON次のようなものを持っています:

{
"notifications": {
    "0": {
        "id": "27429",
        "uID": "6967",
        "text": "Text 1"
    },
    "1": {
        "id": "27317",
        "uID": "6967",
        "text": "Text 2"
    },
    "2": {
        "id": "27315",
        "uID": "6967",
        "text": "Text 3"
    },
    "3": {
        "id": "27314",
        "uID": "6967",
        "text": "Text 4"
    },
    "4": {
        "id": "27312",
        "uID": "6967",
        "text": "Text 5"
    }
}
}

応答から文字列を取り出してい"text"ます。このため、コードは次のようになります。

JSONObject rootObj = new JSONObject(result);
JSONObject jSearchData = rootObj.getJSONObject("notifications");

int maxlimit = 4;

for (int i = 0; i < maxlimit; i++) {
    JSONObject jNotification0 = jSearchData.getJSONObject("" + i + "");

    String text = jNotification0.getString("text");

    System.out.println("Text: " + text);
}

今のところ、これは完全に正常に動作します.4つすべて"text"logs.

さて、私の問題は、サーバーから 1 つまたは 2 つのデータしかない応答を受け取ると、次のようになることです。

{
"notifications": {
    "0": {
        "id": "27429",
        "uID": "6967",
        "text": "Only one text here"
    }
}
}

次に、上記のロジックが失敗し、例外が発生しますorg.json.JSONException: No value for 1

どうすればこの問題を克服できますか。

あらゆる種類の助けをいただければ幸いです。

4

2 に答える 2

4

rootObj.has("1")またはを使用してキーが存在するかどうかをテストできますrootObj.optJSONObject("1");

前者は、このオブジェクトに name のマッピングがある場合に true を返します。後者は、存在する場合は名前でマップされた値を返し、それ以外のJSONObject場合は null を返します。

または、次のように rootObj 内のキーを介して対話できます。

Iterator<String> keys = jSearchData.keys();
while (keys.hasNext()) {
      String key = keys.next();
      JSONObject jNotification0 = jSearchData.optJSONObject(key);
      if (jNotification0 != null) {
           String text = jNotification0.getString("text");
           String uID = jNotification0.getString("uID");
           String id = jNotification0.getString("id");
      }
}
于 2013-07-05T12:35:51.240 に答える
-1

編集:これは間違っています。私は速く読んだのですが、jSearchData が配列ではなくオブジェクトであることに気付きませんでした。しかし、私の意見では、それが実際にオブジェクトではなく配列である場合は、はるかに理にかなっています。

4 をハード コードする必要はありません。次のように、配列の長さを取得してループするだけです。

for (int i = 0; i < jSearchData.length(); i++) {
    JSONObject jNotification0 = jSearchData.getJSONObject("" + i + "");

    String text = jNotification0.getString("text");

    System.out.println("Text: " + text);
}
于 2013-07-05T12:37:49.563 に答える