converti ArrayList <MyCustomClass> in JSONArray


115

Ho un ArrayList che uso all'interno di un ArrayAdapter per un ListView. Devo prendere gli elementi nell'elenco e convertirli in un JSONArray per inviarli a un'API. Ho cercato in giro, ma non ho trovato nulla che spieghi come potrebbe funzionare, qualsiasi aiuto sarebbe apprezzato.

AGGIORNAMENTO - SOLUZIONE

Ecco cosa ho finito per fare per risolvere il problema.

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

Ecco come l'ho convertito:

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

E l'output:

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

Spero che questo aiuti qualcuno un giorno!

Risposte:


115

Se leggo correttamente i costruttori JSONArray, puoi crearli da qualsiasi Collection (arrayList è una sottoclasse di Collection) in questo modo:

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

Riferimenti:


3
Questo funziona nel tuo esempio, ma nel mio ArrayList è composto da oggetti e non stringhe - immagino che avrei dovuto metterlo nella mia domanda. Penso che questa sia la giusta direzione, ma potrei aver bisogno di sovrascrivere toString nella mia classe per farlo funzionare correttamente.
pmko

1
Puoi sempre scorrere il tuo elenco e usare jsArray.put () per questo. Alla fine i tuoi oggetti dovrebbero avere un metodo toString per poterli convertire in JSONArray comunque penso, perché verranno salvati come uno.
Nanne

3
Questo mi ha avvicinato, ma quello che è successo è stato che l'output toString () di ciascun oggetto è stato inserito in JSONArray come String. Ho ancora finito con un JSONArray di stringhe e non di oggetti. Ho finito per creare un metodo sulla mia classe chiamato getJSONObject, quindi ho eseguito il loop su ArrayList e ho inserito il risultato di questo in JSONArray. Grazie per avermi messo sulla strada giusta. Accetterò la tua risposta e poi posterò un esempio di codice di ciò che ho finito per fare. spero che questo non sia male così etichetta.
pmko

64

Usa la libreria Gson per convertire ArrayList in JsonArray.

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

5
Questo non è un org.json.JSONArray come voleva OP, è un com.google.gson.JsonArray.
nima

un altro ID archiviato viene aggiunto aromaticamente durante l'utilizzo di Gson.toJsonTree. come prevenirlo.
Hitesh Kamani

@HiteshKamani Non aggiungerà automaticamente un ID extra, potrebbe essere che la tua classe abbia un campo ID.
Purushotham

In realtà dipende dall'attività. Generalmente non vale la pena includere l'intera libreria esterna per fare cose che Android SDK può adattarsi a se stesso. Soprattutto se sei al limite dei metodi 64K nel progetto.
Maxim Berezovsky

1
ciao uttam soluzione fantastica solo una cosa veloce che non converte l'arraylist all'interno di arraylist in array json
Aashish Bhatnagar

35

Poiché qualcuno capisce che l'OP vuole convertire l'elenco personalizzato in org.json.JSONArraynon com.google.gson.JsonArray, la risposta CORRETTA dovrebbe essere questa:

Gson gson = new Gson();

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

 JSONArray jsonArray =  new JSONArray(listString);

Fantastico :) Sei perfetto
Pratik Butani

@zionpi Qui vengono utilizzate 2 librerie per convertire un elenco di array in array Json
Purushotham

@Uttam Dove puoi vedere due librerie usate in questo?
Ravi Yadav

Se ho ragione, JSONArray proviene da org.json e Gson è da com.google.json
Purushotham

Gah, questo genera un'eccezione controllata: JSONException. Altrimenti la risposta perfetta proprio qui.
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();
            }
        }

    }

2
Questo è uno dei motivi per cui divento un programmatore pigro. Ricevo codice in formato capsula per fare cose da SOF. Copia incolla e tutto funziona. Mi chiedo quando verrò sostituito da un robot che fa esattamente lo stesso ...
Subin Sebastian

1

So che ha già risposto, ma c'è una soluzione migliore qui usa questo codice:

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

In questo modo puoi accedere alle variabili dalla classe senza digitarle manualmente.

Più veloce e migliore .. Spero che questo aiuti.

Saluti. : D


1

Aggiungi al tuo gradle:

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

Converti ArrayListinJsonArray

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

0

Con kotlin e Gson possiamo farlo più facilmente:

  1. Innanzitutto, aggiungi la dipendenza Gson:

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

  1. Crea un kotlinfile separato , aggiungi i seguenti metodi
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)

Nota: non aggiungere la classe declare, aggiungi solo questi metodi, tutto funzionerà bene.

  1. Ora per chiamare:

creare un riferimento di gson:

val gson = Gson ()

Per convertire un array in una stringa json, chiama :

val jsonString=gson.convertToJsonString(arrayList)

Per ottenere l'array dalla stringa json, chiama :

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

Per convertire un modello in una stringa json, chiama:

val jsonString=gson.convertToJsonString(model)

Per convertire la stringa json in modello, chiama:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.