Conversion de JSONarray en ArrayList

105

Je télécharge une chaîne JSON et je la convertis en JSONArray. Je le mets dans une listview et je dois pouvoir supprimer de cette listview plus tard, et comme JSONArray n'a pas de méthode .remove (merci Obama), j'essaye de le convertir en arraylist.

voici mon JSON (le array.toString ()):

[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}]

J'ai besoin de le mettre dans un tableau et de pouvoir appeler les chaînes par leurs clés respectives. Appréciez toute aide!

TheGeekNess
la source
Lorsque vous dites clés, cela n'implique-t-il pas une sorte de dictionnaire (carte sous Android)? Un tableau sera basé sur un index. Jetez un œil à developer.android.com/reference/java/util/Map.html pour savoir comment créer et utiliser.
brianestey
Une carte peut-elle être utilisée pour remplir une vue de liste avec un adaptateur de base personnalisé? Je préfère ne pas utiliser d'index au cas où le JSON changerait d'ordre.
TheGeekNess
ListView récupérera les objets de l'adaptateur par index, vous devrez donc dans tous les cas maintenir la liste dans un certain ordre. Si vous souhaitez conserver l'ordre des clés (et savoir quelles sont les clés au moment de la compilation), vous pouvez coder en dur un tableau de ces clés dans l'ordre que vous souhaitez et l'utiliser pour votre ordre lors de la récupération de la carte.
brianestey

Réponses:

164
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
   for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i));
   } 
} 
Sagar Maiyad
la source
3
Et listdata.add(jArray.optJSONObject(i));si votre listdata est un arrayList JSONObject. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian
2
Bon extrait. Juste au cas où quelqu'un le voudrait: il existe une classe d'assistance qui convertit JSONObject / JSONArray en une carte / liste standard sur le github gist.github.com/codebutler/2339666
inexcii
2
Pourquoi ne pas utiliser un ArrayList<Object>?
natanavra
Comment puis-je gérer le Json Array est vide. s'il vous plaît répondez-moi mon frère.
MohanRaj S
3
Existe-t-il un autre moyen de faire cela sans boucle?
K.Sopheak
65

Je l'ai fait en utilisant Gson(par Google) .

Ajoutez la ligne suivante à votre module build.gradle:

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON chaîne:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c201\",\n" +
            "                \"name\": \"Johnny Depp\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c202\",\n" +
            "                \"name\": \"Leonardo Dicaprio\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c203\",\n" +
            "                \"name\": \"John Wayne\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c204\",\n" +
            "                \"name\": \"Angelina Jolie\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c205\",\n" +
            "                \"name\": \"Dido\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c206\",\n" +
            "                \"name\": \"Adele\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c207\",\n" +
            "                \"name\": \"Hugh Jackman\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c208\",\n" +
            "                \"name\": \"Will Smith\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c209\",\n" +
            "                \"name\": \"Clint Eastwood\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2010\",\n" +
            "                \"name\": \"Barack Obama\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2011\",\n" +
            "                \"name\": \"Kate Winslet\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2012\",\n" +
            "                \"name\": \"Eminem\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        }\n" +
            "    ]";

ContactModel.java:

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

Code pour convertir une chaîne JSON en ArrayList<Model>:

Remarque: vous devez importer java.lang.reflect.Type;:

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

J'espère que ceci vous aidera.

Hiren Patel
la source
4
TROIS LIGNES ... FAITES! Je pense que cela aurait dû être la réponse acceptée car (a) ce ne sont que trois lignes de code qui fonctionnent à merveille, et (b) peu de réponses effectuent réellement une traduction typée de JSONArray vers List <CustomObject>. Je vous remercie!
John Ward
Ce doit être un JSONArray, le JSONElement ne semble pas fonctionner. alors, utilisez la getAsJsonArray()méthode apparemment. Je vous remercie!
嘉 恒 陶
1
Exactement ce dont j'avais besoin, merci! Remarque: vous devez importer ces éléments: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H le
Génial, cela aurait dû être la réponse acceptée !. Merci
Yeuni
cela ne fonctionne pas en disant que l'init de typetoken est protégé
nikoss le
7

essayez de cette façon. Faites simplement une boucle à travers cela, construisant votre propre tableau. Ce code suppose qu'il s'agit d'un tableau de chaînes, il ne devrait pas être difficile à modifier pour s'adapter à votre structure de tableau particulière.

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
Sunil Kumar
la source
6

Au lieu de convertir la chaîne JSON en ArrayList ou même en Map, vous pouvez simplement créer un JSONObject lui-même. Cet objet a la capacité d' obtenir des valeurs de chaîne par clé , comme vous le souhaitez et également de supprimer des objets .

Pour créer un à JSONObjectpartir d'une chaîne JSON correctement formatée, vous appelez simplement le constructeur approprié .

JSONObject json = new JSONObject(jsonString);
Brianestey
la source
1
Le problème que je rencontre avec cette solution en particulier, c'est que lorsqu'il s'agit de JSONObject et de JSONArray, ils lancent des JSONException. Parfois, il est pratique de transmettre le contenu d'un JSONArray à une fonction qui ne devrait pas avoir à connaître JSON.
Aaron Dougherty
2
Je suis d'accord. J'utiliserais le JSONObject dans le cadre de l'analyse du texte JSON dans un objet modèle utilisable. Toute exception JSONException levée indiquerait un problème avec le JSON source, ce qui signifie que vous ne pouvez pas l'analyser dans un JSONArray ou JSONObject, et encore moins un objet de modèle différent.
brianestey
6

J'ai une solution rapide. Créez simplement un fichierArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

Usage:

ArrayList<Object> list = ArrayUtil.convert(jArray);

ou

JSONArray jArr = ArrayUtil.convert(list);
Vasilii Suricov
la source
Que dois-je faire si besoin de retourner unArrayList<String>
Je pense qu'il n'est pas possible de convertir ArrayList <Object> en ArrayList <String>
Vasilii Suricov
1
Félicitations à cette réponse. U a résolu ma journée! J'ai passé 2 heures à essayer de résoudre ce problème. En fait, mon problème était que je voulais mettre le converti JSONArraydans une liste afin que je puisse mettre le Listdans un HashMap, donc cet util a fonctionné assez bien pour moi. Merci @Vasilii Suricov
Jose Mhlanga
5

Dans Java 8,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())
Anant Simran Singh
la source
1
Le seul problème avec cela est que JSONArray.getString (...) lève une exception qui doit être gérée à l'intérieur du mappage, de sorte que vous vous retrouvez avec List<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());ce qui n'est plus si élégant. Donc je vais aller avec un foreach :)
LazR
C'est la meilleure réponse ici (à mon humble avis) mais ce serait élégant s'il y avait un moyen de ne pas avoir besoin d'accéder à la référence jsonArray plus d'une fois.
djangofan
4
 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));
Trieur
la source
2

Pour le rendre pratique, utilisez POJO.

essayez comme ça ...

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);
R9J
la source
1

Utilisation de Gson

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;
kunal khedkar
la source
1

si vous souhaitez extraire des données sous forme de tableau de chaînes JSON, voici mon code de travail. changer le paramètre en tant que vos données.


Classe PoJo

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

Extrayez vos données en utilisant la ligne de code ci-dessous

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

il vous renverra la liste des objets de classe PoJo.

Mehul Boghra
la source
1

Style Java 8

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());
Min Hyoung Hong
la source
0
public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
        throws JSONException {
  ArrayList<JSONObject> jsonObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           jsonObjects.add(array.getJSONObject(i++))
       );
  return jsonObjects;
}
ceph3us
la source
0

J'ai une solution rapide. Créez simplement un fichierArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

Usage:

ArrayList<Object> list = ArrayUtil.convert(jArray);

ou

JSONArray jArr = ArrayUtil.convert(list);
Bheem Singh
la source
0

Variante générique

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

    for (int i = 0; i < jsonArray.length(); i++) {

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));
yoAlex5
la source
0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@simplifié

Naveen Sunkavalli
la source
0

Juste en passant par le sujet original du fil:

conversion de jsonarray en liste (utilisé jackson jsonarray et object mapper ici):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);
Prem Abhisek
la source
0

Une alternative plus simple à Java 8:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
Vivek Dhayaal
la source