web-dev-qa-db-fra.com

Convertir un tableau Json en un tableau Java normal

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

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

Si vous n'avez pas encore d'objet JSONArray, appelez

JSONArray jsonArray = new JSONArray(jsonArrayString);

Ensuite, il vous suffit de parcourir cette étape pour créer votre propre tableau. Ce code suppose qu'il s'agit d'un tableau de chaînes, il ne devrait pas être difficile de le modifier pour l'adapter à la structure de votre tableau.

List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
}
54
Nick

Peut-être que c'est seulement une solution de contournement (pas très efficace) mais vous pouvez faire quelque chose comme ça:

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

Évidemment, vous pouvez changer le séparateur ',' avec tout ce que vous voulez (j'avais une JSONArray d'adresses e-mail)

10
Guido Sabatini

Au lieu d'utiliser la bibliothèque org.json intégrée, essayez d'utiliser Jackson ou GSON, où il s'agit d'une ligne. Avec Jackson, f.ex:

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

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

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

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);
}
4
nurxyz

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;
        }
0
Iman Marashi

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 listview:

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

...
0
Joolah

Je sais que cette question concerne JSONArray, mais voici un exemple que j'ai trouvé utile, dans lequel 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 aussi avec un tableau de chaînes

0
pchot

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

0
user10878560

on commence à partir 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;
}

next crée une version générique 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;
}
0
ceph3us

En utilisant Java Streams, vous pouvez simplement utiliser un IntStream mappant les objets:

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

Nous pouvons simplement convertir le JSON en chaîne lisible et le scinder 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("\",\"");
0
Mayank Yadav