Converti Json Array in un normale elenco Java


130

Esiste un modo per convertire l'array JSON in un normale array Java per l'associazione dati ListView per Android?


8
La cosa divertente è che org.JSONArrayusa un ArrayList sotto il cofano ... The arrayList where the JSONArray's properties are kept, quindi la maggior parte del looping non viene fatto per nulla in molti casi (solo per l'incapsulamento)
Christophe Roussy,

Risposte:


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

5
per loop manca la parentesi di chiusura ... provato a modificare ma non sono sufficienti caratteri per passare l'approvazione. Oh bene! solo un FYI.
Matt K,

in realtà non manca, il risponditore ha appena incollato un pezzo di codice con le parentesi graffe aperte e chiuse della funzione.
Sarim Javaid Khan,

1
Cosa succede se jsonArray.get(i)restituisce null (come risultato dell'analisi di questo:) [ "String 1", null, "String 2" ]? Allora il tuo crash for-loop non sarebbe?
dbm

Grazie. Se uno ha lo sring, allora JSONArray può essere creato come JSONArray jsonArray = new JSONArray (yourString); il resto del codice rimarrà lo stesso.
Kaushik Lele,

A seconda dell'implementazione potrebbe essere necessario size()invece di length().
Guillaume F.,

57

Se non si dispone già di un oggetto JSONArray, chiamare

JSONArray jsonArray = new JSONArray(jsonArrayString);

Quindi esegui semplicemente il loop, creando il tuo array. Questo codice presuppone che sia un array di stringhe, non dovrebbe essere difficile modificarlo per adattarlo alla propria struttura di array.

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

2
Scusa, hai ragione - sto confondendo gli elenchi con JSONArrays :) È davvero JSONArray.length ().
Nick,

13

Invece di utilizzare la org.jsonlibreria in bundle , prova a utilizzare Jackson o GSON, dove si tratta di una riga. Con Jackson, f.ex:

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

11

Forse è solo una soluzione alternativa (non molto efficiente) ma potresti fare qualcosa del genere:

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

Ovviamente puoi cambiare il ' ,' separatore con qualsiasi cosa ti piaccia (avevo un JSONArrayindirizzo e-mail)


8
Nota che devi essere assolutamente sicuro che i dati non contengano il tuo carattere separatore, altrimenti finirai con dati corrotti.
Artemix,

1
e il risultato deve essere una stringa.
Nicolas Tyler,

Una fodera, perfetta.
Zeeshan,

4

L'utilizzo può utilizzare un String[]anziché un ArrayList<String>:

Ridurrà il sovraccarico di memoria di un ArrayList

Spero che sia d'aiuto!

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

3

Utilizzando Java Streams puoi semplicemente usare una IntStreammappatura degli oggetti:

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

0

So che la domanda riguarda JSONArray ma ecco un esempio che ho trovato utile in cui non è necessario utilizzare JSONArray per estrarre oggetti da 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);
    }
}

Funziona anche con array di stringhe


0

Ecco un modo migliore per farlo: se stai ricevendo i dati dall'API. Quindi PARSE il JSON e caricandolo sulla visualizzazione elenco:

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

iniziamo dalla conversione [JSONArray -> Elenco <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;
}

crea quindi una versione generica sostituendo array.getJSONObject (i ++) con POJO

esempio :

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

Puoi usare un String[]invece di un ArrayList<String>:

Spero che sia d'aiuto!

   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

   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

Possiamo semplicemente convertire il JSON in stringa leggibile e dividerlo usando il metodo "split" della 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("\",\"");

-2

So che la domanda era per Java. Ma voglio condividere una possibile soluzione Kotlinperché penso che sia utile.

Con Kotlin puoi scrivere una funzione di estensione che converte a JSONArrayin un array nativo (Kotlin):

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

Ora puoi chiamare asArray()direttamente su JSONArrayun'istanza.


-3

Che ne dici di usare java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())

15
Non vedo un toArray()metodo nei JSONArray()documenti. json.org/javadoc/org/json/JSONArray.html Questa domanda probabilmente non sarebbe stata posta se ci fosse un semplice toArray().
javajavajavajavajava,

1
net.sf.json.JSONArray ha il metodo toArray (), quindi questa risposta funziona per questa libreria JSON. La domanda non specificava la libreria utilizzata.
ilinca,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.