簡體   English   中英

JSON Android/Java 中的數組迭代

[英]JSON Array iteration in Android/Java

我正在構建一個需要下載並與在線數據庫同步的 android 應用程序,我將我的查詢從應用程序發送到 php 頁面,該頁面以 881569990078588 格式從數據庫返回相關行。

有人可以告訴我迭代 JSON 數組的最佳方法嗎?

我收到一組對象:

[{json object},{json object},{json object}]

我可以用來訪問數組中的 JSONObject 的最簡單的代碼是什么?

編輯:現在我想到了我用來迭代循環的方法是:

for (String row: json){
     id = row.getInt("id");
     name = row.getString("name");
     password = row.getString("password");
}

所以我想我以某種方式能夠將返回的 Json 變成可迭代數組。 任何想法我怎么能做到這一點?

我為我的含糊不清道歉,但我從 web 上找到的一個例子開始工作,但此后一直無法找到它。

我認為這段代碼簡短而清晰:

int id;
String name;
JSONArray array = new JSONArray(string_of_json_array);
for (int i = 0; i < array.length(); i++) {
    JSONObject row = array.getJSONObject(i);
    id = row.getInt("id");
    name = row.getString("name");
}

這就是你要找的嗎?

我做了兩種不同的方法,

1.) 制作地圖

        HashMap<String, String> applicationSettings = new HashMap<String,String>();
        for(int i=0; i<settings.length(); i++){
            String value = settings.getJSONObject(i).getString("value");
            String name = settings.getJSONObject(i).getString("name");
            applicationSettings.put(name, value);
        }

2.) 制作一個名字的 JSONArray

    JSONArray names = json.names();
    JSONArray values = json.toJSONArray(names);
    for(int i=0; i<values.length(); i++){
        if (names.getString(i).equals("description")){
            setDescription(values.getString(i));
        }
        else if (names.getString(i).equals("expiryDate")){
            String dateString = values.getString(i);
            setExpiryDate(stringToDateHelper(dateString)); 
        }
        else if (names.getString(i).equals("id")){
            setId(values.getLong(i));
        }
        else if (names.getString(i).equals("offerCode")){
            setOfferCode(values.getString(i));
        }
        else if (names.getString(i).equals("startDate")){
            String dateString = values.getString(i);
            setStartDate(stringToDateHelper(dateString));
        }
        else if (names.getString(i).equals("title")){
            setTitle(values.getString(i));
        }
    }

不幸的是, JSONArray支持foreach語句,例如:

 for(JSONObject someObj : someJsonArray) { // do something about someObj .... .... }

當我嘗試@vipw 的建議時,我遇到了這個異常: The method getJSONObject(int) is undefined for the type JSONArray

這對我有用:

int myJsonArraySize = myJsonArray.size();

for (int i = 0; i < myJsonArraySize; i++) {
    JSONObject myJsonObject = (JSONObject) myJsonArray.get(i);

    // Do whatever you have to do to myJsonObject...
}

如果您使用的是開源的JSON.org Java implementation ,則只需讓 JSONArray 實現Iterable接口並將以下方法添加到類中:

@Override
public Iterator iterator() {
    return this.myArrayList.iterator();
}

這將使 JSONArray 的所有實例都可迭代,這意味着for (Object foo : bar)語法現在可以使用它(注意 foo 必須是一個對象,因為 JSONArrays 沒有聲明的類型)。 所有這些都有效,因為 JSONArray 類由一個簡單的 ArrayList 支持,它已經是可迭代的。 我想其他開源實現也很容易改變。

在數組上,查找:

 JSONArray menuitemArray = popupObject.getJSONArray("menuitem");

您為每個條目使用相同的 Cast 對象。 在每次迭代中,您只是更改了同一個對象,而不是創建一個新對象。

此代碼應該修復它:

JSONArray jCastArr = jObj.getJSONArray("abridged_cast");
ArrayList<Cast> castList= new ArrayList<Cast>();

for (int i=0; i < jCastArr.length(); i++) {
    Cast person = new Cast();  // create a new object here
    JSONObject jpersonObj = jCastArr.getJSONObject(i);

    person.castId = (String) jpersonObj.getString("id");
    person.castFullName = (String) jpersonObj.getString("name");

    castList.add(person);
}
details.castList = castList;

在迭代 JSON 數組(org.json.JSONArray,內置於 Android)時,注意對象; 例如,您可能會得到"null"而不是字符串。

支票可能如下所示:

s[i] = array.isNull(i) ? null : array.getString(i);

或者,特別是在沒有iterator()的 Android 上,您可以定義自己的迭代器:

import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;

public final
class JSONArrayIterator<E> implements Iterator<E> {
    private JSONArray jsonArray;
    private int l;
    private int i;

    JSONArrayIterator(JSONArray jsonArray) {
        this.jsonArray = jsonArray;
        this.l = jsonArray.length();
        this.i = 0;
    }
    @SuppressWarnings("unchecked")
    public E next() {
        try {
            Object o = this.jsonArray.get(this.i++);
            return (E)o;
        } catch (JSONException ex) {
        }
        return null;
    }

}

當您假設數組的元素類型都相同時,它會起作用。 在許多情況下,這可能不是一個好的做法,因此您可能希望添加更多類型檢查。

但是你可以使用:

for (JSONObject row: new JSONArrayIterator<JSONObject>(jsonArray)){
     id = row.getInt("id");
     name = row.getString("name");
     password = row.getString("password");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM