如何在Java中检查JSONArray是否为空?

30

我正在开发一款Android应用程序,用于获取名为“WebUntis”的Web服务的JSON内容。我获取到的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”的数组。

我正在获取这些数组的内容,然后将它们存储在一个ArrayList中。但是当其中一个数组为空时,比如;

    {"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:
 }

有人可以帮助我吗?

4个回答

54

如果数组在文件中被定义了 但是 是空的,例如:

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

那么getJSONArray("kl")将返回一个 数组,但该对象并不为 null。然后,如果你执行以下操作:

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

kl不为null,但是kl.getJSONObject(0)会抛出异常 - 数组中没有第一个元素。

相反您可以检查length(),例如:

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

2
不错的工作 if(kl != null && kl.length() > 0 ){ 简单易懂。 - marlonpya

1
您还可以使用isEmpty()方法,这是我们用来检查列表是否为空的方法。该方法返回一个布尔值。如果列表为空,它将返回true,否则返回false。例如:
if (!k1.isEmpty()) {
    klassenID[i] = kl.getJSONObject(0).getString("id");     
}

1
您可以使用常规的 length() 方法。它返回JSONArray的大小。如果数组为空,则返回0。因此,您可以检查它是否具有元素。这也让您跟踪数组中的总元素数量,您不会超出索引。
if(k1 != null && k1.length != 0){
     //Do something.
}

0

这是另一种做法...

call.enqueue(new Callback<JsonObject>() {
    @Override
    public void onResponse(Call<JsonObject> call,
                           Response<JsonObject> response) {

        JSONObject jsonObject;
        try {
            jsonObject = new JSONObject(new Gson().toJson(response.body()));


            JSONArray returnArray = jsonObject.getJSONArray("my_array");

            // Do Work Only If Not Null
            if (!returnArray.isNull(0)) {

                for (int l = 0; l < returnArray.length(); l++) {
                    if (returnArray.length() > 0) {

                        // Get The Json Object
                        JSONObject returnJSONObject = returnArray.getJSONObject(l);

                        // Get Details
                        String imageUrl = returnJSONObject.optString("image");

                    }
                }
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onFailure(Call<JsonObject> call,
                          Throwable t) {

    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接