Convertir Json Array en liste Java normale

130

Existe-t-il un moyen de convertir JSON Array en Java Array normal pour la liaison de données Android ListView?

Houston nous avons un problème
la source
8
Le plus drôle, c'est qu'il org.JSONArrayutilise une ArrayList sous le capot ... The arrayList where the JSONArray's properties are kept, donc la plupart des boucles se font pour rien dans de nombreux cas (juste pour l'encapsulation)
Christophe Roussy

Réponses:

186
ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
   int len = jsonArray.length();
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
} 
Pentium10
la source
5
la boucle for manque la parenthèse fermante ... a essayé de modifier mais ce n'est pas assez de caractères pour passer l'approbation. tant pis! juste un FYI.
Matt K du
itz ne manque pas en fait, le répondeur vient de coller un morceau de code avec les accolades ouvertes et fermantes de la fonction.
Sarim Javaid Khan
1
Que se passe-t-il si jsonArray.get(i)retourne null (suite à l'analyse de this :) [ "String 1", null, "String 2" ]? Votre boucle for ne planterait-elle pas alors?
dbm
Merci. Si on a sring alors JSONArray peut être créé en tant que JSONArray jsonArray = new JSONArray (yourString); le reste du code restera le même.
Kaushik Lele
Selon l'implémentation dont vous pourriez avoir besoin à la size()place de length().
Guillaume F.
57

Si vous ne disposez pas déjà d'un objet JSONArray, appelez

JSONArray jsonArray = new JSONArray(jsonArrayString);

Ensuite, parcourez simplement cela, en 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.

List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
}
pseudo
la source
2
Désolé, vous avez raison - je confond Lists avec JSONArrays :) Il s'agit bien de JSONArray.length ().
Nick
13

Au lieu d'utiliser une org.jsonbibliothèque intégrée, essayez d'utiliser Jackson ou GSON, où il s'agit d'une ligne unique. Avec Jackson, par exemple:

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
StaxMan
la source
11

Ce n'est peut-être qu'une solution de contournement (pas très efficace) mais vous pouvez faire quelque chose comme ceci:

String[] resultingArray = yourJSONarray.join(",").split(",");

Évidemment, vous pouvez changer le ,séparateur ' ' avec tout ce que vous voulez (j'avais plusieurs JSONArrayadresses e-mail)

Guido Sabatini
la source
8
Notez que vous devez être absolument sûr que les données ne contiennent pas votre caractère de séparation, sinon vous vous retrouverez avec des données corrompues.
Artemix
1
et le résultat doit être une chaîne.
Nicolas Tyler
Une doublure, parfaite.
zeeshan
4

L'utilisation peut utiliser un String[]au lieu d'un ArrayList<String>:

Cela réduira la surcharge de mémoire d'un ArrayList

J'espère que ça aide!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}
Nurnachman
la source
3

En utilisant Java Streams, vous pouvez simplement utiliser un IntStreammappage des objets:

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());
Samuel Philipp
la source
0

Je sais que cette question concerne JSONArray, mais voici l'exemple que j'ai trouvé utile où vous n'avez pas besoin d'utiliser JSONArray pour extraire des objets de JSONObject.

import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

String jsonStr = "{\"types\":[1, 2]}";
JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
List<Long> list = (List<Long>) json.get("types");
if (list != null) {
    for (Long s : list) {
        System.out.println(s);
    }
}

Fonctionne également avec un tableau de chaînes

pchot
la source
0

Voici une meilleure façon de le faire: si vous obtenez les données de l'API. Ensuite, PARSEZ le JSON et chargez-le dans votre liste:

protected void onPostExecute(String result) {
                Log.v(TAG + " result);


                if (!result.equals("")) {

                    // Set up variables for API Call
                    ArrayList<String> list = new ArrayList<String>();

                    try {
                        JSONArray jsonArray = new JSONArray(result);

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

                            list.add(jsonArray.get(i).toString());

                        }//end for
                    } catch (JSONException e) {
                        Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                        e.printStackTrace();
                    }


                    adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            // ListView Clicked item index
                            int itemPosition = position;

                            // ListView Clicked item value
                            String itemValue = (String) listView.getItemAtPosition(position);

                            // Show Alert
                            Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                        }
                    });

                    adapter.notifyDataSetChanged();


                        adapter.notifyDataSetChanged();

...
Joolah
la source
0

nous partons de la conversion [JSONArray -> List <JSONObject>]

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

créer ensuite une version générique en remplaçant array.getJSONObject (i ++) par POJO

exemple :

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
        throws JSONException {
  ArrayList<Tt> tObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           tObjects.add( (T) createT(forClass, array.getJSONObject(i++))) 
       );
  return tObjects;
}

private static T createT(Class<T> forCLass, JSONObject jObject) {
   // instantiate via reflection / use constructor or whatsoever 
   T tObject = forClass.newInstance(); 
   // if not using constuctor args  fill up 
   // 
   // return new pojo filled object 
   return tObject;
}
ceph3us
la source
0

Vous pouvez utiliser un String[]au lieu d'un ArrayList<String>:

J'espère que ça aide!

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }
Iman Marashi
la source
0

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }

user10878560
la source
0

Nous pouvons simplement convertir le JSON en chaîne lisible et le diviser en utilisant la méthode "split" de la classe String.

String jsonAsString = yourJsonArray.toString();
//we need to remove the leading and the ending quotes and square brackets
jsonAsString = jsonAsString.substring(2, jsonAsString.length() -2);
//split wherever the String contains ","
String[] jsonAsStringArray = jsonAsString.split("\",\"");
Mayank Yadav
la source
-2

Je sais que la question était pour Java. Mais je veux partager une solution possible Kotlincar je pense que c'est utile.

Avec Kotlin, vous pouvez écrire une fonction d'extension qui convertit a JSONArrayen un tableau natif (Kotlin):

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

Vous pouvez désormais appeler asArray()directement une JSONArrayinstance.

Johannes Barop
la source
-3

Que diriez-vous d'utiliser java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())
Michal Tsadok
la source
15
Je ne vois pas de toArray()méthode dans la JSONArray()documentation. json.org/javadoc/org/json/JSONArray.html Cette question n'aurait probablement pas été posée s'il y avait un simple toArray().
javajavajavajavajava
1
net.sf.json.JSONArray a la méthode toArray () donc cette réponse fonctionne pour cette bibliothèque JSON. La question ne précisait pas la bibliothèque utilisée.
ilinca