ArrayList <MyCustomClass> को JSONArray में बदलें


115

मेरे पास एक ArrayList है जिसे मैं एक ListView के लिए एक ArrayAdapter के भीतर उपयोग करता हूं। मुझे सूची में आइटम लेने और उन्हें एपीआई में भेजने के लिए JSONArray में बदलने की आवश्यकता है। मैंने चारों ओर खोज की है, लेकिन ऐसा कुछ भी नहीं मिला है जो बताता है कि यह कैसे काम कर सकता है, किसी भी मदद की सराहना की जाएगी।

अद्यतन - समाधान

यहाँ मैं इस मुद्दे को हल करने के लिए क्या कर रहा हूँ।

ArrayList में वस्तु:

public class ListItem {
    private long _masterId;
    private String _name;
    private long _category;

    public ListItem(long masterId, String name, long category) {
        _masterId = masterId;
        _name = name;
        _category = category;
    }

    public JSONObject getJSONObject() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("Id", _masterId);
            obj.put("Name", _name);
            obj.put("Category", _category);
        } catch (JSONException e) {
            trace("DefaultListItem.toString JSONException: "+e.getMessage());
        }
        return obj;
    }
}

यहाँ मैं इसे कैसे परिवर्तित किया है:

ArrayList<ListItem> myCustomList = .... // list filled with objects
JSONArray jsonArray = new JSONArray();
for (int i=0; i < myCustomList.size(); i++) {
        jsonArray.put(myCustomList.get(i).getJSONObject());
}

और आउटपुट:

[{"Name":"Name 1","Id":0,"Category":"category 1"},{"Name":"Name 2","Id":1,"Category":"category 2"},{"Name":"Name 3","Id":2,"Category":"category 3"}]

आशा है कि यह किसी दिन किसी की मदद करता है!

जवाबों:


115

अगर मैं JSONArray कंस्ट्रक्टरों को सही ढंग से पढ़ता हूं, तो आप उन्हें किसी भी संग्रह से बना सकते हैं (arrayList संग्रह का एक उपवर्ग है) जैसे:

ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("baar");
JSONArray jsArray = new JSONArray(list);

संदर्भ:


3
यह आपके उदाहरण में काम करता है, लेकिन मेरा ArrayList में वस्तुओं का समावेश है न कि स्ट्रिंग्स का - अनुमान है कि मुझे इसे अपने प्रश्न में रखना चाहिए था। मुझे लगता है कि यह सही दिशा है, लेकिन मुझे इसे सही तरीके से काम करने के लिए अपनी कक्षा में आगे बढ़ने की जरूरत नहीं है।
पीको

1
आप हमेशा अपनी सूची पर लूप कर सकते हैं और इसके लिए jsArray.put () का उपयोग कर सकते हैं। अंत में आपकी वस्तुओं के लिए उनके पास एक स्ट्रींग विधि होनी चाहिए, जिसे वैसे भी JSONArray में परिवर्तित किया जा सकता है क्योंकि मुझे लगता है, क्योंकि वे एक के रूप में सहेजे जाएंगे।
नन्ने

3
जो मुझे बंद कर दिया, लेकिन जो हुआ वह यह था कि प्रत्येक वस्तु से होने वाली (toString) आउटपुट को JSONArray में एक स्ट्रिंग के रूप में डाला गया था। मैं अभी भी स्ट्रिंग्स के JSONArray और वस्तुओं के साथ समाप्त नहीं हुआ। मैंने अपनी कक्षा पर एक विधि बनाना शुरू कर दिया, जिसे getJSONObject कहा जाता है, फिर ArrayList पर लूप किया और इसका परिणाम JSONArray में डाल दिया। मुझे सही रास्ते पर लाने के लिए धन्यवाद। मैं आपके उत्तर को स्वीकार करने जा रहा हूं और फिर जो मैंने किया, उसका एक नमूना नमूना पोस्ट करूंगा। मुझे आशा है कि यह बुरा एसओ शिष्टाचार नहीं है।
पीको

64

ArsonList को JsonArray में बदलने के लिए Gson लाइब्रेरी का उपयोग करें।

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();

5
यह एक org.json.JSONArray नहीं है जैसा कि ओपी चाहता था, यह एक com.google.gson.JsonArray है।
निमा

Gson.toJsonTree का उपयोग करते समय दायर की गई एक और आईडी को सुगंधित रूप से जोड़ा जाता है। इसे कैसे रोका जाए।
हितेश कमानी

@HiteshKamani यह स्वचालित रूप से एक अतिरिक्त आईडी नहीं जोड़ेगा, हो सकता है कि आपकी कक्षा एक आईडी फ़ील्ड हो।
पुरुषोत्तम

यह वास्तव में कार्य पर निर्भर करता है। आम तौर पर पूरे बाहरी पुस्तकालय को शामिल करने लायक नहीं है चीजों को करने के लिए एंड्रॉइड एसडीके खुद को सूट कर सकता है। विशिष्ट यदि आप परियोजना में 64K तरीकों के किनारे पर हैं।
मैक्सिम बेरेज़ोव्स्की

1
हाय uttam जबरदस्त समाधान बस एक त्वरित बात यह सरणी सूची में सरणी को जोंस सरणी में परिवर्तित नहीं करता है
आतिश भटनागर

35

जैसे ही कोई व्यक्ति यह पता लगाता है कि ओपी कस्टम सूची को org.json.JSONArrayनहीं में परिवर्तित करना चाहता है com.google.gson.JsonArray, तो सही उत्तर इस तरह होना चाहिए:

Gson gson = new Gson();

String listString = gson.toJson(
                    targetList,
           new TypeToken<ArrayList<targetListItem>>() {}.getType());

 JSONArray jsonArray =  new JSONArray(listString);

बहुत बढ़िया :) आप सही हैं
प्रतीक बुटानी

@zionpi यहाँ 2 लाइब्रेरियों का उपयोग सरणी सूची को Json array में बदलने के लिए किया जा रहा है
Purushotham

@ यूटम आप इसमें इस्तेमाल किए गए दो कामों को कहां देख सकते हैं?
रवि यादव

अगर मैं सही हूं, JSONArray org.json से है और Gson com.google.json से है
पुरुषोत्तम

GAH ने इस अपवाद की जाँच की: JSONException। अन्यथा एकदम सही जवाब यहाँ।
Babken वर्दान्यान

5
public void itemListToJsonConvert(ArrayList<HashMap<String, String>> list) {

        JSONObject jResult = new JSONObject();// main object
        JSONArray jArray = new JSONArray();// /ItemDetail jsonArray

        for (int i = 0; i < list.size(); i++) {
            JSONObject jGroup = new JSONObject();// /sub Object

            try {
                jGroup.put("ItemMasterID", list.get(i).get("ItemMasterID"));
                jGroup.put("ID", list.get(i).get("id"));
                jGroup.put("Name", list.get(i).get("name"));
                jGroup.put("Category", list.get(i).get("category"));

                jArray.put(jGroup);

                // /itemDetail Name is JsonArray Name
                jResult.put("itemDetail", jArray);
                return jResult;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }

2
यह एक कारण है कि मैं एक आलसी प्रोग्रामर बन जाता हूं। मुझे SOF से चीजें करने के लिए कैप्सूल आकार कोड मिलता है। कॉपी पेस्ट, और सब कुछ काम करता है। आश्चर्य है कि जब मैं एक रोबोट द्वारा प्रतिस्थापित किया जाएगा जो बिल्कुल वैसा ही करता है ...
सबिन सेबस्टियन

1

मुझे पता है कि इसका पहले से ही उत्तर है, लेकिन इस कोड का उपयोग करने से बेहतर समाधान मिलता है:

for ( Field f : context.getFields() ) {
     if ( f.getType() == String.class ) || ( f.getType() == String.class ) ) {
           //DO String To JSON
     }
     /// And so on...
}

इस तरह आप मैन्युअल रूप से टाइप किए बिना वर्ग से चर का उपयोग कर सकते हैं ..

तेज और बेहतर .. आशा है कि यह मदद करता है।

चीयर्स। : डी


1

अपनी श्रेणी में जोड़ें:

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

में परिवर्तित ArrayListकरेंJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);

0

कोटलिन और Gson के साथ हम इसे और अधिक आसानी से कर सकते हैं:

  1. सबसे पहले, Gson निर्भरता जोड़ें:

implementation "com.squareup.retrofit2:converter-gson:2.3.0"

  1. एक अलग kotlinफ़ाइल बनाएँ , निम्न विधियाँ जोड़ें
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

fun <T> Gson.convertToJsonString(t: T): String {
    return toJson(t).toString()
}

fun <T> Gson.convertToModel(jsonString: String, cls: Class<T>): T? {
    return try {
        fromJson(jsonString, cls)
    } catch (e: Exception) {
        null
    }
}

inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)

नोट: घोषित वर्ग को न जोड़ें, बस इन विधियों को जोड़ें, सब कुछ ठीक चलेगा।

  1. अब कॉल करने के लिए:

gson का संदर्भ बनाएँ:

वैल ग्सन = Gson ()

सरणी को जोंस स्ट्रिंग में बदलने के लिए, कॉल करें :

val jsonString=gson.convertToJsonString(arrayList)

Json string से सरणी प्राप्त करने के लिए, कॉल करें :

val arrayList=gson.fromJson<ArrayList<YourModelClassName>>(jsonString)

किसी मॉडल को json string में बदलने के लिए, कॉल करें:

val jsonString=gson.convertToJsonString(model)

JSON स्ट्रिंग को मॉडल में बदलने के लिए, कॉल करें:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.