2017-06-10 59 views
0

我正在嘗試通過for-each循環或Iterator而不是正常的for-loop迭代JSONArray ,但看起來像org.json不支持它們。任何想法如何編輯下面的代碼,以便它可以工作,我一直在嘗試像4個小時找到一個解決方案,但可悲的是沒有任何成功。任何幫助將不勝感激。這裏是代碼的重要部分:通過使用for-each循環或使用Iterator(Android Studio)迭代JSON數組

String strJson = loadJsonFromAssetsFolder(); 
JSONObject jsonRootObject = new JSONObject(strJson); 
JSONArray jsonArray = jsonRootObject.optJSONArray("restaurant"); 
    for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject jsonObject = jsonArray.getJSONObject(i); 
      list.add(jsonObject.optString("name").toString()); 
    } 

稍作澄清。第一行基本上是以String形式表示的jsonFile中的文本。起初,我將這些值添加到一個簡單的字符串數組中,但後來我將其更改爲一個ArrayList,因爲如果我要使用for-each循環,那將是合乎邏輯的。我嘗試使用org.json.simple,net.sf.json作爲替代方案,但我無法使用這兩種庫中的任何一種。

回答

0

您可以使用迭代器,因爲JsonArray提供了一個getIterator方法。然而,這些都是原始迭代器,所以沒有與它們相關的特定類型(因此每個元素都被認爲是對象)。你可以低調他們。

ArrayList<String> list = new ArrayList<>(); 
    String strJson = loadJsonFromAssetsFolder(); 
    JSONObject jsonRootObject = new JSONObject(strJson); 
    JSONArray jsonArray = jsonRootObject.optJSONArray("restaurant"); 
    for (Object jsonObject : jsonArray) { 
     list.add(((JSONObject) jsonObject).optString("name")); 
    } 

是否有任何理由,你爲什麼不想使用正常的循環?真的沒有區別。 你也可以看看像GSON這樣的庫,它可以將它映射到Java對象。

+0

嗯,事情是,它的工作完美(從我的角度來看)與正常的循環,但我的隊友之一(我們正在這個項目,我們正在研究)誰審查我的代碼(並比我多得多)告訴我,如果我通過使用foreach循環訪問數組的一個元素會更好,因爲正常的可能「不必要地遍歷整個數組」,例如,如果我想訪問最後一個元素在循環的最後一次迭代中。 順便說一句,我已經嘗試了你的建議,但它沒有工作,foreach是不可能的org.json。並感謝您的答案! – Metodi

+0

@Metodi你是什麼意思,它沒有工作?上面的代碼運行得很好。我沒有得到你隊友的爭論。迭代是一樣的,唯一的區別是你會失去索引變量,數組長度只計算一次,你也可以手動進行。 – petul

+0

當我使用foreach循環時,我收到一條錯誤消息,提示「foreach不適用於鍵入org.json.JSONArray」。如果我使用了一個不同的庫,那將會起作用,但這意味着我需要改變幾乎所有的東西,因爲我已經嘗試過了,所以這會非常煩人。我也會等待他的回答,因爲我也認爲foreach相當於for循環,只是通過擺脫索引來縮短代碼。 – Metodi