convertir ArrayList <MyCustomClass> en JSONArray

115

J'ai un ArrayList que j'utilise dans un ArrayAdapter pour un ListView. Je dois prendre les éléments de la liste et les convertir en JSONArray pour les envoyer à une API. J'ai cherché, mais je n'ai rien trouvé qui explique comment cela pourrait fonctionner, toute aide serait appréciée.

MISE À JOUR - SOLUTION

Voici ce que j'ai fini par faire pour résoudre le problème.

Objet dans 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;
    }
}

Voici comment je l'ai 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());
}

Et la sortie:

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

J'espère que cela aidera quelqu'un un jour!

pmko
la source

Réponses:

115

Si je lis correctement les constructeurs JSONArray, vous pouvez les construire à partir de n'importe quelle Collection (arrayList est une sous-classe de Collection) comme ceci:

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

Références:

Nanne
la source
3
Cela fonctionne dans votre exemple, mais dans le mien, ArrayList est composé d'objets et non de chaînes - je suppose que j'aurais dû le mettre dans ma question. Je pense que c'est la bonne direction, mais je devrai peut-être remplacer toString dans ma classe pour que cela fonctionne correctement.
pmko
1
Vous pouvez toujours faire une boucle sur votre liste et utiliser jsArray.put () pour cela. En fin de compte, vos objets devraient avoir une méthode toString pour être convertis en JSONArray de toute façon, je pense, car ils seront enregistrés en un seul.
Nanne
3
Cela m'a rapproché, mais ce qui s'est passé, c'est que la sortie toString () de chaque objet a été insérée dans le JSONArray en tant que String. Je me suis quand même retrouvé avec un JSONArray de chaînes et non d'objets. J'ai fini par créer une méthode sur ma classe appelée getJSONObject, puis j'ai bouclé sur l'ArrayList et mis le résultat de cela dans le JSONArray. Merci de m'avoir mis sur la bonne voie. Je vais accepter votre réponse, puis publier un exemple de code de ce que j'ai fini par faire. j'espère que ce n'est pas une mauvaise étiquette SO.
pmko
64

Utilisez la bibliothèque Gson pour convertir ArrayList en JsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
Purushotham
la source
5
Ce n'est pas un org.json.JSONArray comme OP le voulait, c'est un com.google.gson.JsonArray.
nima
un autre identifiant est ajouté de manière aromatique lors de l'utilisation de Gson.toJsonTree. comment l'empêcher.
Hitesh Kamani
@HiteshKamani Cela n'ajoutera pas automatiquement un identifiant supplémentaire, peut-être que votre classe a un champ d'identifiant.
Purushotham
Cela dépend en fait de la tâche. Ne vaut généralement pas la peine d'inclure une bibliothèque externe entière pour faire des choses que le SDK Android peut lui convenir. Surtout si vous êtes à la limite des méthodes 64K dans le projet.
Maxim Berezovsky
1
salut uttam solution géniale juste une chose rapide, il ne convertit pas arraylist dans arraylist en tableau json
Aashish Bhatnagar
35

Comme quelqu'un se rend compte que l'OP veut convertir la liste personnalisée en org.json.JSONArraypas le com.google.gson.JsonArray, la réponse CORRECT devrait être comme ceci:

Gson gson = new Gson();

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

 JSONArray jsonArray =  new JSONArray(listString);
zionpi
la source
Génial :) Vous êtes parfait
Pratik Butani
@zionpi Ici, 2 bibliothèques sont utilisées pour convertir une liste de tableaux en tableau Json
Purushotham
@Uttam Où pouvez-vous voir deux bibliothèques utilisées ici?
Ravi Yadav
Si j'ai raison, JSONArray provient de org.json et Gson de com.google.json
Purushotham
Gah cela lève une exception vérifiée: JSONException. Sinon, la réponse parfaite ici.
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
la source
2
C'est l'une des raisons pour lesquelles je deviens un programmeur paresseux. Je reçois du code de la taille d'une capsule pour faire des choses de SOF. Copiez-collez et tout fonctionne. Je me demande quand je serai remplacé par un robot qui fait exactement la même chose ...
Subin Sebastian
1

Je sais que c'est déjà répondu, mais il y a une meilleure solution ici, utilisez ce code:

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

De cette façon, vous pouvez accéder aux variables de la classe sans les saisir manuellement.

Plus vite et mieux .. J'espère que cela vous aidera.

À votre santé. :RÉ

ralphgabb
la source
1

Ajoutez à votre note:

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

Convertir ArrayListenJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);
Patel profond
la source
0

Avec kotlin et Gson, nous pouvons le faire plus facilement:

  1. Tout d'abord, ajoutez la dépendance Gson:

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

  1. Créez un kotlinfichier séparé , ajoutez les méthodes suivantes
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)

Remarque: n'ajoutez pas de classe declare, ajoutez simplement ces méthodes, tout fonctionnera correctement.

  1. Maintenant pour appeler:

créer une référence de gson:

val gson = Gson ()

Pour convertir un tableau en chaîne json, appelez :

val jsonString=gson.convertToJsonString(arrayList)

Pour obtenir un tableau à partir de la chaîne json, appelez :

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

Pour convertir un modèle en chaîne json, appelez:

val jsonString=gson.convertToJsonString(model)

Pour convertir une chaîne json en modèle, appelez:

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