एंड्रॉइड / जावा में JSON सरणी पुनरावृत्ति


148

मैं एक एंड्रॉइड ऐप बना रहा हूं जिसे एक ऑनलाइन डेटाबेस के साथ डाउनलोड और सिंक्रनाइज़ करने की आवश्यकता है, मैं ऐप से अपनी क्वेरी को एक पीएचपी पृष्ठ पर भेज रहा हूं जो कि JSON प्रारूप में डेटाबेस से संबंधित पंक्तियों को वापस करता है।

क्या कोई मुझे JSON सरणी के माध्यम से पुनरावृति करने का सबसे अच्छा तरीका बता सकता है?

मुझे वस्तुओं का एक समूह प्राप्त होता है:

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

कोड का सबसे सरल टुकड़ा मैं सरणी में JSONObjects का उपयोग करने के लिए क्या कर सकता हूं?

संपादित करें: अब जब मुझे लगता है कि यह विधि मैंने लूप को पुनरावृत्त करने के लिए उपयोग की थी:

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

तो मुझे लगता है कि मैं किसी तरह लौटे Json और चलने योग्य सरणी बारी करने में सक्षम था। किसी भी विचार मैं इसे कैसे प्राप्त कर सकता हूं?

मैं अपनी योनि के लिए माफी मांगता हूं, लेकिन मुझे यह एक उदाहरण से काम कर रहा था जो मुझे वेब पर मिला और तब से इसे खोजने में असमर्थ हूं।


1
निम्नलिखित लिंक देखें: androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial
Aakash

जवाबों:


67

मैंने इसे दो अलग-अलग तरीकों से किया है,

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

335

मुझे लगता है कि यह कोड छोटा और स्पष्ट है:

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

क्या आप इसी की तलाश में हैं?


3
अच्छा और सरल! बहुत अच्छा काम करता है!
केरविन रामेन

5
ध्यान दें कि यदि आप एक "सरणी" भेजते हैं जिसमें लगातार संख्याएँ नहीं होती हैं, तो आपको JSONObject
अधिकतम 4

हाँ यह सही है, लेकिन बड़ी मात्रा में डेटा प्रसंस्करण में बहुत धीमा है :(
अहमद अर्सलान

@ArslanAhmad यदि आपके पास बड़ी मात्रा में डेटा है, तो आप मेमोरी में संपूर्ण json ऑब्जेक्ट ऐरे का निर्माण नहीं करना चाहते हैं। इसके बजाय SAX-like दृष्टिकोण का उपयोग करें। यहाँ देखें: stackoverflow.com/questions/10657725/…
vipw

यह मेरे लिए काम नहीं करता है। ऑब्जेक्ट के आसपास "{" ब्रैकेट होने के कारण मुझे JSON एक्सेप्शन मिलता है?
filthy_wizard 11

7

दुर्भाग्य से, बयानों का समर्थन JSONArray नहीं करताforeach , जैसे:

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


यह करता है, लेकिन यह ऑब्जेक्ट को JSONObject नहीं लौटाता है
त्रुटि

3
JSONArray वर्ग Iterable इंटरफ़ेस को लागू नहीं करता है
Jorgesys

4

जब मैंने @ 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...
}

Android के लिए, मैंने myJsonArray.size () को myJsonArray.length () के बजाय बदल दिया
ऋषिराज पुरोहित

3

यदि आप JSON.org जावा कार्यान्वयन का उपयोग कर रहे हैं , जो कि खुला स्रोत है, तो आप सिर्फ JSONArray को Iterableइंटरफ़ेस लागू कर सकते हैं और निम्न विधि को कक्षा में जोड़ सकते हैं:

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

यह JSONArray के सभी उदाहरणों को चलने योग्य बना देगा, जिसका अर्थ है कि for (Object foo : bar)सिंटैक्स अब इसके साथ काम करेगा (ध्यान दें कि फू को एक ऑब्जेक्ट होना है, क्योंकि JSONArrays में एक घोषित प्रकार नहीं है)। यह सब काम करता है क्योंकि JSONArray वर्ग एक साधारण ArrayList द्वारा समर्थित है, जो पहले से ही चलने योग्य है। मुझे लगता है कि अन्य खुले स्रोत कार्यान्वयन सिर्फ बदलने के लिए आसान होंगे।


1
यह दिलचस्प है कि एक समय में JSON.org के कार्यान्वयन में JSONArray वर्ग में एक Iterator था, लेकिन उन्होंने इसे हटा दिया: github.com/douglascrockford/JSON-java/commit/…
vipus

@vipw मैंने Iterable को लागू करने के बारे में एक बार उन्हें ई-मेल किया था, लेकिन उन्होंने कहा कि अंततः वे नहीं कर सकते क्योंकि यह जावा 1.4 के साथ संगतता को तोड़ देगा। शायद इसीलिए इसे कमिटमेंट में हटा दिया गया था।
थंडरफॉर्ज


2

आप हर प्रविष्टि के लिए एक ही कास्ट ऑब्जेक्ट का उपयोग कर रहे हैं। प्रत्येक पुनरावृत्ति पर आपने नया बनाने के बजाय केवल उसी ऑब्जेक्ट को बदल दिया।

इस कोड को इसे ठीक करना चाहिए:

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;

1

एक JSON सरणी (org.json.JSONArray, Android में निर्मित) पर पुनरावृति करते हुए, अशक्त वस्तुओं के लिए देखें; उदाहरण के लिए, आप अशक्त स्ट्रिंग के "null"बजाय प्राप्त कर सकते हैं ।

एक चेक की तरह लग सकता है:

s[i] = array.isNull(i) ? null : array.getString(i);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.