JSONarray को ArrayList में परिवर्तित करना


104

मैं एक JSON स्ट्रिंग डाउनलोड कर रहा हूं और इसे JSONArray में परिवर्तित कर रहा हूं। Im इसे एक सूची में डाल रहा है और बाद में उस सूची से हटाने में सक्षम होने की आवश्यकता है, और चूंकि JSONArray के पास कोई .remove विधि नहीं है (धन्यवाद ओबामा), मैं इसे एक सरणी सूची में बदलने की कोशिश कर रहा हूं।

यहाँ मेरा JSON (array.toString ()) है:

[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}]

मुझे इसे एक ऐरे में लाना होगा और स्ट्रिंग्स को उनकी संबंधित कुंजियों से कॉल करने में सक्षम होना चाहिए। किसी भी मदद की सराहना!


जब आप चाबियाँ कहते हैं, तो क्या यह किसी प्रकार का एक शब्दकोश (एंड्रॉइड में मैप) नहीं है? एक सरणी इंडेक्स-आधारित होगी। कैसे बनाएं और कैसे उपयोग करें, इसके लिए developer.android.com/reference/java/util/Map.html पर एक नज़र डालें ।
ब्रायनस्टी

क्या कस्टम बेसेड एडाप्टर के साथ एक सूची को दर्शाने के लिए मानचित्र का उपयोग किया जा सकता है? JSON कभी भी ऑर्डर बदलने की स्थिति में आईडी का उपयोग नहीं करता है।
गीकनेस

सूची दृश्य को अनुक्रमणिका द्वारा एडाप्टर से ऑब्जेक्ट मिलेंगे, इसलिए किसी भी स्थिति में आपको कुछ क्रम में सूची बनाए रखने की आवश्यकता होगी। यदि आप कुंजियों के क्रम को बनाए रखना चाहते हैं (और जानते हैं कि कुंजियाँ संकलन के समय क्या हैं), तो आप उन कुंजियों की एक सारणी को हार्ड-कोड कर सकते हैं जिन्हें आप पसंद करते हैं और मानचित्र से लाते समय अपने आदेश के लिए इसका उपयोग करते हैं।
ब्रायनस्टी

जवाबों:


164
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
   for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i));
   } 
} 

3
और listdata.add(jArray.optJSONObject(i));अगर आपकी listdata एक JSONObject arrayList है। ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
सबिन सेबेस्टियन

2
अच्छा स्निपेट। बस अगर कोई चाहता है: एक सहायक वर्ग है जो JSONObject / JSONArray को github gist.github.com/codebutler/2339666
1

2
क्यों नहीं एक का उपयोग करें ArrayList<Object>?
नतनवरा

कैसे मैं संभाल सकता हूँ Json सरणी खाली है। कृपया मुझे जवाब दो भाई।
मोहनराज एस

3
क्या लूप के बिना ऐसा करने का कोई और तरीका है?
के.एस.फोक

64

मैंने इसे Gson(Google द्वारा) उपयोग कर लिया है ।

अपने मॉड्यूल में निम्नलिखित पंक्ति जोड़ें build.gradle:

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON स्ट्रिंग:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"ravi@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c201\",\n" +
            "                \"name\": \"Johnny Depp\",\n" +
            "                \"email\": \"johnny_depp@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c202\",\n" +
            "                \"name\": \"Leonardo Dicaprio\",\n" +
            "                \"email\": \"leonardo_dicaprio@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c203\",\n" +
            "                \"name\": \"John Wayne\",\n" +
            "                \"email\": \"john_wayne@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c204\",\n" +
            "                \"name\": \"Angelina Jolie\",\n" +
            "                \"email\": \"angelina_jolie@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c205\",\n" +
            "                \"name\": \"Dido\",\n" +
            "                \"email\": \"dido@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c206\",\n" +
            "                \"name\": \"Adele\",\n" +
            "                \"email\": \"adele@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c207\",\n" +
            "                \"name\": \"Hugh Jackman\",\n" +
            "                \"email\": \"hugh_jackman@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c208\",\n" +
            "                \"name\": \"Will Smith\",\n" +
            "                \"email\": \"will_smith@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c209\",\n" +
            "                \"name\": \"Clint Eastwood\",\n" +
            "                \"email\": \"clint_eastwood@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2010\",\n" +
            "                \"name\": \"Barack Obama\",\n" +
            "                \"email\": \"barack_obama@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2011\",\n" +
            "                \"name\": \"Kate Winslet\",\n" +
            "                \"email\": \"kate_winslet@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2012\",\n" +
            "                \"name\": \"Eminem\",\n" +
            "                \"email\": \"eminem@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        }\n" +
            "    ]";

ContactModel.java:

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

JSON स्ट्रिंग परिवर्तित करने के लिए कोड ArrayList<Model>:

नोट: आपको आयात करना होगा java.lang.reflect.Type;:

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

आशा है कि यह आपकी मदद करेगा।


4
तीन लाइनें ... हो गया! मुझे लगता है कि यह स्वीकार किया गया उत्तर होना चाहिए (क) यह कोड की केवल तीन पंक्तियां हैं जो खूबसूरती से काम करती हैं, और (ख) कुछ उत्तर वास्तव में JSONArray से सूची <CustomObject> में टाइप किए गए अनुवाद करते हैं। धन्यवाद!
जॉन वार्ड

यह एक JSONArray होना चाहिए, JSONElement काम नहीं करता है। इसलिए, getAsJsonArray()विधि का उपयोग प्रकट रूप से करें। धन्यवाद!

1
वास्तव में मुझे क्या चाहिए, धन्यवाद! नोट: आपको इन्हें आयात करना होगा: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
चंद्रानी एच।

बहुत बढ़िया, यह स्वीकृत उत्तर होना चाहिए था!। धन्यवाद
Yeuni

यह टाइपेटोकेन के init को सुरक्षित रखते हुए काम नहीं करता है
निकोस

7

इस तरह से कोशिश करें कि उसके माध्यम से लूप करें, अपनी खुद की सरणी का निर्माण करें। यह कोड मानता है कि यह स्ट्रिंग की एक सरणी है, यह आपके विशेष सरणी संरचना के अनुरूप संशोधित करने के लिए कठिन नहीं होना चाहिए।

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );

6

JSON स्ट्रिंग को ArrayList या यहां तक ​​कि मैप में कनवर्ट करने के बजाय, आप केवल JSONObject बना सकते हैं । इस ऑब्जेक्ट में कुंजी द्वारा स्ट्रिंग मान प्राप्त करने की क्षमता है , जैसा कि आप चाहते हैं और वस्तुओं को हटाने के लिए भी ।

JSONObjectठीक से स्वरूपित JSON स्ट्रिंग से बनाने के लिए , आप बस उपयुक्त कंस्ट्रक्टर को कॉल करते हैं ।

JSONObject json = new JSONObject(jsonString);

1
इस समस्या को मैं विशेष रूप से इस समाधान के साथ चलाता हूं, यह है कि जब JSONObject और JSONArray के साथ काम कर रहा है, तो वे JSONException के फेंक देते हैं। कभी-कभी किसी फ़ंक्शन के लिए JSONArray की सामग्री को पास करना आसान होता है जिसे JSON के बारे में जानकारी नहीं होनी चाहिए।
आरोन डौबर्टी

2
मैं सहमत हूँ। मैं JSONObject का उपयोग JSON टेक्स्ट को एक उपयोगी मॉडल ऑब्जेक्ट में पार्स करने के हिस्से के रूप में करूँगा। कोई भी जेएसऑनसेप्शन जो उठाया गया है वह स्रोत JSON के साथ एक समस्या का संकेत देगा, जिसका अर्थ है कि आप इसे JSONArray या JSONObject में पार्स नहीं कर सकते, अकेले एक अलग मॉडल ऑब्जेक्ट दें।
brianestey

6

मेरे पास तेजी से समाधान है। बस एक फ़ाइल बनाएँArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

उपयोग:

ArrayList<Object> list = ArrayUtil.convert(jArray);

या

JSONArray jArr = ArrayUtil.convert(list);

अगर मैं लौटने की जरूरत है तो Wha ArrayList<String>

मुझे लगता है कि ArrayList <string> ArrayList <string>
Vasilii Suricov

1
इस उत्तर के लिए यश। यू ने मेरा दिन हल कर दिया! मैंने इसे ठीक करने के लिए 2 घंटे बिताए। वास्तव में मेरी समस्या यह थी कि मैं JSONArrayएक सूची में परिवर्तित करना चाहता था ताकि मैं इसे लगा सकूंList एक में HashMapहै, इसलिए इस util बहुत अच्छी तरह से मेरे लिए काम किया। धन्यवाद @Vasilii Suricov
जोस म्हालंगा

5

जावा 8 में,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

1
इसके साथ एकमात्र समस्या यह है कि JSONArray.getString (...) एक अपवाद को फेंकता है जिसे मैपिंग के अंदर संभाला जाना है, इसलिए आप इसे समाप्त करते हैं List<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());जो कि अधिक सुरुचिपूर्ण नहीं है। तो मैं एक
फॉर्च्यूनर के

यह यहाँ (imho) सबसे अच्छा जवाब है, लेकिन सुरुचिपूर्ण होगा अगर एक से अधिक बार jsonArray संदर्भ का उपयोग करने की आवश्यकता नहीं है।
djangofan


2

इसे आसान बनाने के लिए, POJO का उपयोग करें।

ऐसे ही प्रयास करें ।।

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);

1

Gson का उपयोग करना

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;

1

यदि आप डेटा फॉर्म JSON स्ट्रिंग ऐरे को निकालना चाहते हैं, तो यहां मेरा काम कोड है। अपने डेटा के रूप में पैरामीटर बदलें।


पूजो वर्ग

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

कोड की रेखा के नीचे अपना डेटा निकालें

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

यह आपको PoJo श्रेणी की वस्तु की सूची लौटाएगा।



0
public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
        throws JSONException {
  ArrayList<JSONObject> jsonObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           jsonObjects.add(array.getJSONObject(i++))
       );
  return jsonObjects;
}

0

मेरे पास तेजी से समाधान है। बस एक फ़ाइल बनाएँArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

उपयोग:

ArrayList<Object> list = ArrayUtil.convert(jArray);

या

JSONArray jArr = ArrayUtil.convert(list);

0

सामान्य रूप

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

    for (int i = 0; i < jsonArray.length(); i++) {

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));


0

बस धागे के मूल विषय से जा रहा है:

जौनसार्रे को सूची में परिवर्तित करना (यहां जैकसन जौनसारे और ऑब्जेक्ट मैपर का उपयोग किया जाता है):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

0

एक सरल जावा 8 विकल्प:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.