web-dev-qa-db-ja.com

JSONArrayがJavaで空かどうかを確認する方法は?

「WebUntis」というWebサービスのjsonコンテンツを取得するAndroidアプリで作業しています。取得しているJsonコンテンツは次のようになります。

{"jsonrpc":"2.0","id":"req-002",
 "result":[
    {"id":125043,"date":20110117,"startTime":800,"endTime":850,
     "kl":[{"id":71}],
     "te":[{"id":23}],
     "su":[{"id":13}],
     "ro":[{"id":1}]},
    {"id":125127,"date":20110117,"startTime":1055,"endTime":1145,
     "kl":[{"id":71}],
     "te":[{"id":41}],
     "su":[{"id":19}],
     "ro":[{"id":31}]},
...]}

結果配列でわかるように、「kl」、「su」、「ro」のような他の配列もあります

これらの配列の内容を取得してから、それらを配列リストに保存します。しかし、これらの配列の1つが空の場合、次のようになります。

    {"jsonrpc":"2.0","id":"req-002",
     "result":[
         {"id":125043,"date":20110117,"startTime":800,"endTime":850,
          "**kl":[]**,
          "te":[{"id":23}],
          "su":[{"id":13}],
          "ro":[{"id":1}]},
         {"id":125127,"date":20110117,"startTime":1055,"endTime":1145,
          "kl":[{"id":71}],
          "te":[{"id":41}],
          "su":[{"id":19}],
          "ro":[{"id":31}]},
...]}

私はいつもエラーIndexOutOfRangeExceptionを受け取っていますが、空の配列を取るべきではないといつも言っています。これは私が試したことです:

 JSONObject jsonResult = new JSONObject(s);
 // Get the result object
 JSONArray arr = jsonResult.getJSONArray("result");

 for (int i = 0; i < arr.length(); i++) {
    JSONObject c = arr.getJSONObject(i);
    anfangStunde[i] = c.getString("startTime");
    endeStunde[i] = c.getString("endTime");

    // get the jsonarrays (kl, su, ro)
    kl = c.getJSONArray("kl");
    su = c.getJSONArray("su");
    ro = c.getJSONArray("ro");

    // check if kl is not null
    if(kl != null){
       klassenID[i] = kl.getJSONObject(0).getString("id");
    }
    if (klassenID[i] != null) {
       klasse = webuntis.klassenMap.get(klassenID[i]);
       Log.d("ID und Klasse=", "" + klassenID[i] + ";" + klasse);
    }
    // get th ids
    fachID[i] = su.getJSONObject(0).getString("id");
    if (fachID[i] != null) {
       fach = webuntis.faecherMap.get(fachID[i]);
       Log.d("ID und Fach=", "" + fachID[i] + ";" + fach);
    }

    // "Start;Ende;Klasse;Fach;Raum" store in arraylist
    webuntis.stundenPlan.add(anfangStunde[i] + ";" + endeStunde[i] + ";" + klasse + ";" + fach);
    // Write Data into a file for offline use:
 }

誰も私を助けることができますか?

21
seriously

配列がファイルで定義されている場合butは空のように:

_...
"kl":[]
...
_

getJSONArray("kl")empty配列を返しますが、オブジェクトはnullではありません。次に、これを行う場合:

_kl = c.getJSONArray("kl");
if(kl != null){
   klassenID[i] = kl.getJSONObject(0).getString("id");
}
_

klnotnullおよびkl.getJSONObject(0)は例外をスローします-最初の要素はありません配列内。

代わりに、length()を確認できます。例:

_kl = c.getJSONArray("kl");
if(kl != null && kl.length() > 0 ){
   klassenID[i] = kl.getJSONObject(0).getString("id");
}
_
40
T.Gounelle

isEmpty()メソッドも使用できます。これは、リストが空かどうかを確認するために使用するメソッドです。このメソッドはブール値を返します。リストが空の場合はtrueを返し、そうでない場合はfalseを返します。例えば:

if (!k1.isEmpty()) {
    klassenID[i] = kl.getJSONObject(0).getString("id");     
}
1
abbu jan