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!

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:


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

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

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

    }

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


1

Adicione ao seu gradle:

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

Converter ArrayListparaJsonArray

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

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.