Esiste un modo per convertire l'array JSON in un normale array Java per l'associazione dati ListView per Android?
Esiste un modo per convertire l'array JSON in un normale array Java per l'associazione dati ListView per Android?
Risposte:
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());
}
}
jsonArray.get(i)
restituisce null (come risultato dell'analisi di questo:) [ "String 1", null, "String 2" ]
? Allora il tuo crash for-loop non sarebbe?
size()
invece di length()
.
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) );
}
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 JSONArray
indirizzo e-mail)
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);
}
Utilizzando Java Streams puoi semplicemente usare una IntStream
mappatura degli oggetti:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
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
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();
...
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;
}
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;
}
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;
}
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("\",\"");
So che la domanda era per Java
. Ma voglio condividere una possibile soluzione Kotlin
perché penso che sia utile.
Con Kotlin puoi scrivere una funzione di estensione che converte a JSONArray
in un array nativo (Kotlin):
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
Ora puoi chiamare asArray()
direttamente su JSONArray
un'istanza.
Che ne dici di usare java.util.Arrays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
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()
.
org.JSONArray
usa 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)