【问题标题】:how to check if a JSONArray is empty in java?如何检查Java中的JSONArray是否为空?
【发布时间】:2015-05-02 16:39:55
【问题描述】:

我正在开发一个获取名为“WebUntis”的网络服务的 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”

我正在获取这些数组的内容,然后将它们存储在数组列表中。 但是当这些数组之一为空时,例如;

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

谁能帮帮我?

【问题讨论】:

    标签: arrays json json-rpc


    【解决方案1】:

    如果文件中定义了数组为空,如:

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

    那么getJSONArray("kl")会返回一个数组,但是对象不是null。然后,如果你这样做:

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

    klnot nullkl.getJSONObject(0) 会抛出异常 - 数组中没有第一个元素。

    您可以查看length(),例如:

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

    【讨论】:

    • 干得好if(kl != null &amp;&amp; kl.length() &gt; 0 ){简单
    【解决方案2】:

    你也可以使用isEmpty()方法,这是我们用来检查列表是否为空的方法。此方法返回一个布尔值。如果列表为空,则返回 true,否则返回 false。例如:

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

    【讨论】:

      【解决方案3】:

      这是另一种方法......

      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) {
      
          }
      });
      

      【讨论】:

        【解决方案4】:

        您可以使用常规的 length() 方法。它返回 JSONArray 的大小。如果数组为空,则返回0。所以,你可以检查它是否有元素。这也可以让您跟踪数组中的总元素,您不会超出索引。

        if(k1 != null && k1.length != 0){
             //Do something.
        }
        

        【讨论】:

          猜你喜欢
          • 2012-08-28
          • 2021-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          相关资源
          最近更新 更多