Konvertieren Sie ArrayList <MyCustomClass> in JSONArray

115

Ich habe eine ArrayList, die ich in einem ArrayAdapter für eine ListView verwende. Ich muss die Elemente in der Liste nehmen und sie in ein JSONArray konvertieren, um sie an eine API zu senden. Ich habe mich umgesehen, aber nichts gefunden, was erklärt, wie dies funktionieren könnte. Jede Hilfe wäre willkommen.

UPDATE - LÖSUNG

Folgendes habe ich getan, um das Problem zu lösen.

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

So habe ich es konvertiert:

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

Und die Ausgabe:

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

Hoffe das hilft jemandem eines Tages!

pmko
quelle

Antworten:

115

Wenn ich die JSONArray-Konstruktoren richtig gelesen habe, können Sie sie aus einer beliebigen Sammlung (arrayList ist eine Unterklasse der Sammlung) wie folgt erstellen:

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

Verweise:

Nanne
quelle
3
Das funktioniert in Ihrem Beispiel, aber in meinem besteht die ArrayList aus Objekten und nicht aus Strings - ich denke, ich hätte das in meine Frage aufnehmen sollen. Ich denke, dies ist die richtige Richtung, aber ich muss möglicherweise toString in meiner Klasse überschreiben, damit dies richtig funktioniert.
PMKO
1
Sie können jederzeit Ihre Liste durchlaufen und dafür jsArray.put () verwenden. Am Ende sollten Ihre Objekte eine toString-Methode haben, damit sie ohnehin in JSONArray konvertiert werden können, da sie als eine gespeichert werden.
Nanne
3
Das hat mich nahe gebracht, aber was passiert ist, war, dass die Ausgabe von toString () von jedem Objekt als String in das JSONArray eingefügt wurde. Am Ende hatte ich immer noch ein JSONArray von Strings und keine Objekte. Am Ende habe ich für meine Klasse eine Methode namens getJSONObject erstellt, dann die ArrayList durchlaufen und das Ergebnis in das JSONArray eingefügt. Danke, dass du mich auf den richtigen Weg gebracht hast. Ich werde Ihre Antwort akzeptieren und dann ein Codebeispiel von dem posten, was ich letztendlich getan habe. Ich hoffe, das ist nicht schlecht, so Etikette.
PMKO
64

Verwenden Sie die Gson-Bibliothek, um ArrayList in JsonArray zu konvertieren.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
Purushotham
quelle
5
Dies ist kein org.json.JSONArray, wie OP wollte, sondern ein com.google.gson.JsonArray.
Nima
Bei Verwendung von Gson.toJsonTree wird eine weitere ID-Datei aromatisch hinzugefügt. wie man es verhindert.
Hitesh Kamani
@HiteshKamani Es wird nicht automatisch eine zusätzliche ID hinzugefügt, möglicherweise hat Ihre Klasse ein ID-Feld.
Purushotham
Es kommt tatsächlich auf die Aufgabe an. Im Allgemeinen lohnt es sich nicht, die gesamte externe Bibliothek einzuschließen, um Dinge zu tun. Android SDK kann sich selbst anpassen. Insbesondere, wenn Sie im Projekt am Rande der 64K-Methoden stehen.
Maxim Berezovsky
1
Hallo Uttam fantastische Lösung, nur eine schnelle Sache, es konvertiert nicht Arraylist innerhalb Arraylist in JSON Array
Aashish Bhatnagar
35

Wenn jemand herausfindet, dass das OP eine benutzerdefinierte Liste in eine org.json.JSONArraynicht konvertieren möchte com.google.gson.JsonArray, sollte die RICHTIGE Antwort folgendermaßen lauten:

Gson gson = new Gson();

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

 JSONArray jsonArray =  new JSONArray(listString);
Zionpi
quelle
Genial
@zionpi Hier werden 2 Bibliotheken verwendet, um eine Array-Liste in ein Json-Array zu konvertieren
Purushotham
@Uttam Wo können Sie zwei Bibliotheken sehen, die hier verwendet werden?
Ravi Yadav
Wenn ich richtig bin, ist JSONArray von org.json und Gson ist von com.google.json
Purushotham
Gah dies löst eine geprüfte Ausnahme aus: JSONException. Ansonsten hier die perfekte Antwort.
Babken Vardanyan
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();
            }
        }

    }
Dhamat Chetan
quelle
2
Dies ist einer der Gründe, warum ich ein fauler Programmierer werde. Ich bekomme Code in Kapselgröße, um Dinge von SOF zu erledigen. Kopieren Einfügen, und alles funktioniert. Ich frage mich, wann ich durch einen Roboter ersetzt werde, der genau das Gleiche tut ...
Subin Sebastian
1

Ich weiß, dass es bereits beantwortet wurde, aber es gibt eine bessere Lösung. Verwenden Sie diesen Code:

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

Auf diese Weise können Sie auf Variablen aus der Klasse zugreifen, ohne sie manuell eingeben zu müssen.

Schneller und besser .. Hoffe das hilft.

Prost. : D.

ralphgabb
quelle
1

Fügen Sie Ihrem Gradle hinzu:

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

Konvertieren ArrayListinJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);
Deep Patel
quelle
0

Mit Kotlin und Gson können wir das einfacher machen:

  1. Fügen Sie zunächst die Gson-Abhängigkeit hinzu:

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

  1. Erstellen Sie eine separate kotlinDatei und fügen Sie die folgenden Methoden hinzu
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)

Hinweis: Fügen Sie keine Deklarationsklasse hinzu, sondern nur diese Methoden. Alles funktioniert einwandfrei.

  1. Jetzt anrufen:

Erstellen Sie eine Referenz von Gson:

val gson = Gson ()

Um ein Array in einen JSON-String zu konvertieren, rufen Sie Folgendes auf :

val jsonString=gson.convertToJsonString(arrayList)

Um ein Array von einem JSON-String abzurufen, rufen Sie Folgendes auf :

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

Um ein Modell in einen JSON-String zu konvertieren, rufen Sie Folgendes auf:

val jsonString=gson.convertToJsonString(model)

Rufen Sie zum Konvertieren eines JSON-Strings in ein Modell Folgendes auf:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
Suraj Vaishnav
quelle