Json Array को सामान्य Java सूची में बदलें


130

क्या एंड्रॉइड लिस्ट व्यू डेटा बाइंडिंग के लिए जेसन एरे को सामान्य जावा अर्रे में बदलने का एक तरीका है?


8
मजेदार बात यह है कि org.JSONArrayहुड के नीचे एक ArrayList का उपयोग करता है ... The arrayList where the JSONArray's properties are kept, इसलिए अधिकांश लूपिंग कई मामलों में कुछ भी नहीं करने के लिए किया जाता है (बस इनकैप्सुलेशन के लिए)
Christophe Roussy

जवाबों:


186
ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
   int len = jsonArray.length();
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
} 

5
लूप के लिए समापन कोष्ठक याद आ रहा है ... संपादन की कोशिश की, लेकिन अनुमोदन पारित करने के लिए यह पर्याप्त वर्ण नहीं है। ओह अच्छा! सिर्फ एक FYI करें।
मैट के

यह वास्तव में गायब नहीं है, उत्तरदाता ने फ़ंक्शन के खुले और समापन ब्रेसिज़ के साथ कोड का एक हिस्सा चिपकाया है।
सरिम जावेद खान

1
यदि jsonArray.get(i)रिटर्न अशक्त होता है (इसे पार्स करने के परिणामस्वरूप:) [ "String 1", null, "String 2" ]? तो अपने पाश दुर्घटना के लिए नहीं होगा?
dbm

धन्यवाद। यदि किसी में श्रृंग है तो JSONArray को JSONArray jsonArray = new JSONArray (yourString) के रूप में बनाया जा सकता है; बाकी कोड वही रहेगा।
कौशिक लेले

कार्यान्वयन के आधार पर आपको size()इसके बजाय आवश्यकता हो सकती है length()
गिलियूम एफ।

57

यदि आपके पास पहले से ही JSONArray ऑब्जेक्ट नहीं है, तो कॉल करें

JSONArray jsonArray = new JSONArray(jsonArrayString);

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

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

2
क्षमा करें, आप सही हैं - मैं JSONArrays के साथ सूचियों को भ्रमित कर रहा हूं :) यह वास्तव में JSONArray.length () है।
निक

13

बंडल-इन org.jsonलाइब्रेरी का उपयोग करने के बजाय , जैक्सन या जीएसओएन का उपयोग करने का प्रयास करें, जहां यह एक-लाइनर है। जैक्सन के साथ, f.ex:

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);

11

शायद यह केवल एक वर्कअराउंड है (बहुत कुशल नहीं) लेकिन आप ऐसा कुछ कर सकते हैं:

String[] resultingArray = yourJSONarray.join(",").split(",");

स्पष्ट रूप से आप ' ,' विभाजक को अपनी पसंद की किसी भी चीज़ से बदल सकते हैं (मेरे पास JSONArrayईमेल पते हैं)


8
ध्यान दें कि आपको इस बात पर पूरा यकीन होना चाहिए कि डेटा में आपका विभाजक चार्ट नहीं है, अन्यथा आप भ्रष्ट डेटा को समाप्त कर देंगे।
आर्टेमिक्स

1
और परिणाम के लिए एक स्ट्रिंग होना चाहिए।
निकोलस टायलर

एक लाइनर, एकदम सही।
जीशान

4

उपयोग के String[]बजाय एक का उपयोग कर सकते हैं ArrayList<String>:

यह मेमोरी ओवरहेड को कम कर देगा जो एक ArrayList के पास है

आशा करता हूँ की ये काम करेगा!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}

3

जावा स्ट्रीम का उपयोग करके आप केवल IntStreamवस्तुओं को मैप कर सकते हैं:

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());

0

मुझे पता है कि सवाल JSONArray के बारे में है, लेकिन यहाँ उदाहरण मुझे उपयोगी लगा है जहाँ आपको JSONObject से ऑब्जेक्ट निकालने के लिए JSONArray का उपयोग करने की आवश्यकता नहीं है।

import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

String jsonStr = "{\"types\":[1, 2]}";
JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
List<Long> list = (List<Long>) json.get("types");
if (list != null) {
    for (Long s : list) {
        System.out.println(s);
    }
}

तार के साथ भी काम करता है


0

यहां यह करने का एक बेहतर तरीका है: यदि आपको एपीआई से डेटा मिल रहा है। फिर JSON को पार्स करें और इसे अपनी सूची में लोड करें:

protected void onPostExecute(String result) {
                Log.v(TAG + " result);


                if (!result.equals("")) {

                    // Set up variables for API Call
                    ArrayList<String> list = new ArrayList<String>();

                    try {
                        JSONArray jsonArray = new JSONArray(result);

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

                            list.add(jsonArray.get(i).toString());

                        }//end for
                    } catch (JSONException e) {
                        Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                        e.printStackTrace();
                    }


                    adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            // ListView Clicked item index
                            int itemPosition = position;

                            // ListView Clicked item value
                            String itemValue = (String) listView.getItemAtPosition(position);

                            // Show Alert
                            Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                        }
                    });

                    adapter.notifyDataSetChanged();


                        adapter.notifyDataSetChanged();

...

0

हम रूपांतरण से शुरू कर रहे हैं [JSONArray -> सूची <JSONObject>]

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

अगला POJO के साथ array.getJSONObject (i ++) की जगह जेनेरिक संस्करण बनाएं

उदाहरण :

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
        throws JSONException {
  ArrayList<Tt> tObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           tObjects.add( (T) createT(forClass, array.getJSONObject(i++))) 
       );
  return tObjects;
}

private static T createT(Class<T> forCLass, JSONObject jObject) {
   // instantiate via reflection / use constructor or whatsoever 
   T tObject = forClass.newInstance(); 
   // if not using constuctor args  fill up 
   // 
   // return new pojo filled object 
   return tObject;
}

0

आप String[]इसके बजाय का उपयोग कर सकते हैं ArrayList<String>:

आशा करता हूँ की ये काम करेगा!

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }

0

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }


0

हम केवल JSON को पठनीय स्ट्रिंग में बदल सकते हैं, और स्ट्रिंग वर्ग की "स्प्लिट" विधि का उपयोग करके इसे विभाजित कर सकते हैं।

String jsonAsString = yourJsonArray.toString();
//we need to remove the leading and the ending quotes and square brackets
jsonAsString = jsonAsString.substring(2, jsonAsString.length() -2);
//split wherever the String contains ","
String[] jsonAsStringArray = jsonAsString.split("\",\"");

-2

मुझे पता है कि प्रश्न के लिए था Java। लेकिन मैं एक संभावित समाधान साझा करना चाहता हूं Kotlinक्योंकि मुझे लगता है कि यह उपयोगी है।

कोटलिन के साथ आप एक एक्सटेंशन फ़ंक्शन लिख सकते हैं जो JSONArrayएक देशी (कोटलिन) सरणी में परिवर्तित होता है :

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

अब आप asArray()एक JSONArrayउदाहरण पर सीधे कॉल कर सकते हैं ।


-3

Java.util.Arrays का उपयोग कैसे करें?

List<String> list = Arrays.asList((String[])jsonArray.toArray())

15
मुझे डॉक्स toArray()में कोई विधि नहीं दिख रही है JSONArray()json.org/javadoc/org/json/JSONArray.html यह सवाल शायद नहीं पूछा गया था कि क्या कोई सरल बात थी toArray()
javajavajavajavajajava

1
net.sf.json.JSONArray में TheArray () विधि है इसलिए यह प्रतिक्रिया इस JSON लाइब्रेरी के लिए काम करती है। प्रश्न में पुस्तकालय का उपयोग नहीं किया गया था।
इलियाना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.