convertir ArrayList <MyCustomClass> a JSONArray

115

Tengo un ArrayList que uso dentro de un ArrayAdapter para un ListView. Necesito tomar los elementos de la lista y convertirlos a JSONArray para enviarlos a una API. He buscado, pero no he encontrado nada que explique cómo podría funcionar, cualquier ayuda sería apreciada.

ACTUALIZACIÓN - SOLUCIÓN

Esto es lo que terminé haciendo para resolver el problema.

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

Así es como lo convertí:

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

Y la salida:

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

¡Espero que esto ayude a alguien algún día!

pmko
fuente

Respuestas:

115

Si leo los constructores JSONArray correctamente, puede construirlos a partir de cualquier colección (arrayList es una subclase de Collection) así:

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

Referencias:

Nanne
fuente
3
Eso funciona en su ejemplo, pero en el mío, ArrayList se compone de objetos y no de cadenas; supongo que debería haberlo puesto en mi pregunta. Creo que esta es la dirección correcta, pero es posible que deba anular toString en mi clase para que esto funcione correctamente.
pmko
1
Siempre puede recorrer su lista y usar jsArray.put () para esto. Al final, creo que sus objetos deberían tener un método toString para que se conviertan a JSONArray de todos modos, porque se guardarán como uno.
Nanne
3
Eso me acercó, pero lo que sucedió fue que la salida toString () de cada objeto se insertó en JSONArray como una cadena. Todavía terminé con un JSONArray of Strings y no Objects. Terminé creando un método en mi clase llamado getJSONObject, luego hice un bucle sobre ArrayList y puse el resultado de esto en JSONArray. Gracias por ponerme en el camino correcto. Voy a aceptar su respuesta y luego publicar una muestra de código de lo que terminé haciendo. Espero que esto no sea tan mala etiqueta.
pmko
64

Utilice la biblioteca Gson para convertir ArrayList a JsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
Purushotham
fuente
5
Esto no es un org.json.JSONArray como OP quería, es un com.google.gson.JsonArray.
nima
se agrega aromáticamente una identificación más archivada mientras se usa Gson.toJsonTree. cómo prevenirlo.
Hitesh Kamani
@HiteshKamani No agregará una identificación adicional automáticamente, puede ser que su clase tenga un campo de identificación.
Purushotham
De hecho, depende de la tarea. Por lo general, no vale la pena incluir una biblioteca externa completa para hacer cosas que el SDK de Android pueda adaptarse. Especialmente si está al borde de los métodos de 64K en project.
Maxim Berezovsky
1
Hola, uttam, una solución increíble, solo una cosa rápida, no convierte la lista de matrices dentro de la lista de matrices en una matriz json
Aashish Bhatnagar
35

Cuando alguien se da cuenta de que el OP quiere convertir la Lista personalizada en org.json.JSONArrayno com.google.gson.JsonArray, la respuesta CORRECTA debería ser así:

Gson gson = new Gson();

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

 JSONArray jsonArray =  new JSONArray(listString);
zionpi
fuente
Impresionante :) Eres perfecto
Pratik Butani
@zionpi Aquí se utilizan 2 bibliotecas para convertir una lista de matrices en una matriz Json
Purushotham
@Uttam ¿Dónde puedes ver dos bibliotecas utilizadas en esto?
Ravi Yadav
Si estoy en lo cierto, JSONArray es de org.json y Gson es de com.google.json
Purushotham
Gah, esto arroja una excepción marcada: JSONException. De lo contrario, la respuesta perfecta aquí.
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
fuente
2
Esta es una de las razones por las que me convierto en un programador vago. Obtengo código del tamaño de una cápsula para hacer cosas de SOF. Copia, pega y todo funciona. Me pregunto cuándo seré reemplazado por un robot que haga exactamente lo mismo ...
Subin Sebastian
1

Sé que ya está respondido, pero hay una mejor solución aquí, use este código:

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

De esta manera, puede acceder a las variables de la clase sin escribirlas manualmente.

Más rápido y mejor .. Espero que esto ayude.

Salud. :RE

ralphgabb
fuente
1

Agrega a tu gradle:

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

Convertir ArrayListaJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);
Patel profundo
fuente
0

Con kotlin y Gson lo podemos hacer más fácilmente:

  1. Primero, agregue la dependencia de Gson:

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

  1. Cree un kotlinarchivo separado , agregue los siguientes métodos
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: No agregue declare class, simplemente agregue estos métodos, todo funcionará bien.

  1. Ahora para llamar:

crea una referencia de gson:

val gson = Gson ()

Para convertir una matriz a una cadena json, llame a :

val jsonString=gson.convertToJsonString(arrayList)

Para obtener una matriz de la cadena json, llame a :

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

Para convertir un modelo a una cadena json, llame a:

val jsonString=gson.convertToJsonString(model)

Para convertir la cadena json en modelo, llame a:

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