web-dev-qa-db-fra.com

Comment mettre une liste <class> dans un JSONObject puis lire cet objet?

J'ai un List<class> que je voudrais convertir en un objet JSON, puis parcourir les données de l'objet JSON. 

Si c'était juste un list<String> je pourrais faire quelque chose comme:

JSONObject obj = new JSONObject();
List<String> sList = new ArrayList<String>();
sList.add("val1");
sList.add("val2");

obj.put("list", sList);

Ensuite, je pourrais parcourir la liste comme:

JSONArray jArray = obj.getJSONArray("list");
for(int ii=0; ii < jArray.size(); ii++
  System.out.println(jArray.getString(ii));

Le problème avec l'utilisation de la classe est que je dois avoir accès aux données de chaque élément de classe de mon list<class> et je ne sais pas comment l'encoder/le parcourir en JSON. Toute aide serait grandement appréciée. 

16
Grammin

Appelez getJSONObject() au lieu de getString(). Cela vous donnera un handle sur l'objet JSON dans le tableau et vous pourrez ensuite obtenir la propriété de l'objet à partir de là.

Par exemple, pour obtenir la propriété "valeur" d'un List<SomeClass>SomeClass a une String getValue() et une setValue(String value):

JSONObject obj = new JSONObject();
List<SomeClass> sList = new ArrayList<SomeClass>();

SomeClass obj1 = new SomeClass();
obj1.setValue("val1");
sList.add(obj1);

SomeClass obj2 = new SomeClass();
obj2.setValue("val2");
sList.add(obj2);

obj.put("list", sList);

JSONArray jArray = obj.getJSONArray("list");
for(int ii=0; ii < jArray.length(); ii++)
  System.out.println(jArray.getJSONObject(ii).getString("value"));
17
Rob Tanzola

Supposons que la classe est Données avec deux objets nom et dob qui sont tous deux chaînes .

Initialement, vérifiez si la liste est vide. Ajoutez ensuite les objets de la liste à un JSONArray

JSONArray allDataArray = new JSONArray();
List<Data> sList = new ArrayList<String>();

    //if List not empty
    if (!(sList.size() ==0)) {

        //Loop index size()
        for(int index = 0; index < sList.size(); index++) {
            JSONObject eachData = new JSONObject();
            try {
                eachData.put("name", sList.get(index).getName());
                eachData.put("dob", sList.get(index).getDob());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            allDataArray.put(eachData);
        }
    } else {
        //Do something when sList is empty
    }

Enfin, ajoutez le JSONArray à un JSONObject .

JSONObject root = new JSONObject();
    try {
        root.put("data", allDataArray);
    } catch (JSONException e) {
        e.printStackTrace();
    }

Vous pouvez également obtenir ces données sous forme de String aussi.

String jsonString = root.toString();
3
96var3

Vous pouvez utiliser un sérialiseur/désérialiseur JSON du type flexjson pour effectuer la conversion à votre place.

1
Rob Tanzola

Voici comment je le fais avec Google Gson. Je ne sais pas s'il existe un moyen plus simple de procéder (avec ou sans bibliothèque externe).

 Type collectionType = new TypeToken<List<Class>>() {
                } // end new
                        .getType();

                String gsonString = 
                new Gson().toJson(objList, collectionType);
1
uncaught_exceptions

Juste pour mettre à jour ce fil, voici comment ajouter une liste (sous forme de tableau json) à JSONObject . Plz, remplacez YourClass par votre nom de classe;

List<YourClass> list = new ArrayList<>();
JSONObject jsonObject = new JSONObject();

org.codehaus.jackson.map.ObjectMapper objectMapper = new 
org.codehaus.jackson.map.ObjectMapper();
org.codehaus.jackson.JsonNode listNode = objectMapper.valueToTree(list);
org.json.JSONArray request = new org.json.JSONArray(listNode.toString());
jsonObject.put("list", request);
0
Youness