converter ArrayList <MyCustomClass> em JSONArray

115

Eu tenho um ArrayList que uso dentro de um ArrayAdapter para um ListView. Preciso pegar os itens da lista e convertê-los em um JSONArray para enviar a uma API. Eu procurei por aí, mas não encontrei nada que explique como isso pode funcionar, qualquer ajuda seria apreciada.

ATUALIZAÇÃO - SOLUÇÃO

Aqui está o que acabei fazendo para resolver o problema.

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

Aqui está como eu o converti:

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 a saída:

[{"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 isso ajude alguém algum dia!

pmko
fonte

Respostas:

115

Se eu li os construtores JSONArray corretamente, você pode construí-los a partir de qualquer Collection (arrayList é uma subclasse de Collection) assim:

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

Referências:

Nanne
fonte
3
Isso funciona no seu exemplo, mas no meu a ArrayList é composta de Objetos e não Strings - acho que deveria ter colocado isso na minha pergunta. Acho que essa é a direção certa, mas posso precisar substituir toString na minha classe para fazer isso funcionar corretamente.
pmko de
1
Você sempre pode fazer um loop em sua lista e usar jsArray.put () para isso. No final, seus objetos devem ter um método toString para serem convertidos em JSONArray de qualquer maneira, eu acho, porque eles serão salvos como um.
Nanne
3
Isso me aproximou, mas o que aconteceu foi que a saída toString () de cada objeto foi inserida no JSONArray como uma String. Eu ainda terminei com um JSONArray de Strings e não de Objetos. Acabei criando um método em minha classe chamado getJSONObject, então executei um loop em ArrayList e coloquei o resultado disso no JSONArray. Obrigado por me colocar no caminho certo. Vou aceitar sua resposta e postar um exemplo de código do que acabei fazendo. Espero que isso não seja uma má etiqueta.
pmko de
64

Use a biblioteca Gson para converter ArrayList em JsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
Purushotham
fonte
5
Este não é um org.json.JSONArray como OP queria, é um com.google.gson.JsonArray.
nima
mais um arquivo de identificação é adicionado aromaticamente ao usar Gson.toJsonTree. como evitá-lo.
Hitesh Kamani de
@HiteshKamani Não vai adicionar um id extra automaticamente, pode ser que sua classe esteja tendo um campo id.
Purushotham de
Na verdade, depende da tarefa. Geralmente não vale a pena incluir toda a biblioteca externa para fazer coisas que o Android SDK pode se adequar a si mesmo. Especialmente se você estiver no limite dos métodos de 64K em projeto.
Maxim Berezovsky
1
Oi uttam solução incrível, rápido, não converte arraylist dentro de arraylist em array json
Aashish Bhatnagar
35

Quando alguém descobre que o OP deseja converter a Lista personalizada em org.json.JSONArraynão a com.google.gson.JsonArray, a resposta CORRETA deve ser esta:

Gson gson = new Gson();

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

 JSONArray jsonArray =  new JSONArray(listString);
Zionpi
fonte
Incrível :) Você é perfeito
Pratik Butani,
@zionpi Aqui, 2 bibliotecas estão sendo usadas para converter uma lista de array em array Json
Purushotham
@Uttam Onde você pode ver duas bibliotecas usadas nisso?
Ravi Yadav
Se estou correto, JSONArray é de org.json e Gson é de com.google.json
Purushotham
Gah, isso lança uma exceção verificada: JSONException. Caso contrário, a resposta perfeita bem aqui.
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
fonte
2
Esta é uma das razões pelas quais me tornei um programador preguiçoso. Recebo código do tamanho de cápsula para fazer coisas do SOF. Copie e cole e tudo funciona. Imagino quando serei substituído por um robô que faz exatamente o mesmo ...
Subin Sebastian
1

Eu sei que já foi respondido, mas existe uma solução melhor aqui, 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...
}

Desta forma, você pode acessar variáveis ​​da classe sem digitá-las manualmente.

Mais rápido e melhor .. Espero que isso ajude.

Felicidades. : D

Ralphgabb
fonte
1

Adicione ao seu gradle:

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

Converter ArrayListparaJsonArray

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

Com kotlin e Gson podemos fazer isso mais facilmente:

  1. Primeiro, adicione a dependência Gson:

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

  1. Crie um kotlinarquivo separado , adicione os seguintes 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: Não adicione declarar classe, apenas adicione esses métodos, tudo funcionará bem.

  1. Agora, para ligar:

crie uma referência de gson:

val gson = Gson ()

Para converter array em string json, chame :

val jsonString=gson.convertToJsonString(arrayList)

Para obter a matriz da string json, chame :

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

Para converter um modelo em string json, chame:

val jsonString=gson.convertToJsonString(model)

Para converter string json em modelo, chame:

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