¿Hay alguna manera de convertir JSON Array a Java Array normal para el enlace de datos Android ListView?
¿Hay alguna manera de convertir JSON Array a Java Array normal para el enlace de datos Android ListView?
Respuestas:
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)devuelve nulo (como resultado de analizar esto [ "String 1", null, "String 2" ])? ¿No se estrellaría entonces tu bucle for?
size()lugar de length().
Si aún no tiene un objeto JSONArray, llame
JSONArray jsonArray = new JSONArray(jsonArrayString);
Luego simplemente recorra eso, construyendo su propia matriz. Este código asume que es una matriz de cadenas, no debería ser difícil de modificar para adaptarse a su estructura de matriz particular.
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
list.add( jsonArray.getString(i) );
}
Tal vez sea solo una solución (no muy eficiente) pero podría hacer algo como esto:
String[] resultingArray = yourJSONarray.join(",").split(",");
Obviamente, puede cambiar el ,separador ' ' con lo que quiera (tenía una dirección JSONArrayde correo electrónico)
Use puede usar un en String[]lugar de un ArrayList<String>:
Reducirá la sobrecarga de memoria que tiene una ArrayList
¡Espero eso ayude!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
Usando Java Streams puedes usar un IntStreammapeo de los objetos:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
Sé que esa pregunta es sobre JSONArray, pero aquí hay un ejemplo que he encontrado útil cuando no necesita usar JSONArray para extraer objetos 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);
}
}
Funciona también con una variedad de cuerdas.
Aquí hay una mejor manera de hacerlo: si obtiene los datos de la API. Luego PARSE el JSON y cárguelo en su vista de lista:
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();
...
comenzamos desde la conversión [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;
}
luego cree una versión genérica reemplazando array.getJSONObject (i ++) con POJO
ejemplo:
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;
}
Puede usar un en String[]lugar de un ArrayList<String>:
¡Espero eso ayude!
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;
}
Simplemente podemos convertir el JSON en una cadena legible y dividirlo usando el método "dividir" de la clase 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("\",\"");
Sé que la pregunta era para Java. Pero quiero compartir una posible solución Kotlinporque creo que es útil.
Con Kotlin puede escribir una función de extensión que convierta una JSONArraymatriz nativa (Kotlin):
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
Ahora puede llamar asArray()directamente en una JSONArrayinstancia.
¿Qué hay de usar java.util.Arrays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
toArray()método en los JSONArray()documentos. json.org/javadoc/org/json/JSONArray.html Esta pregunta probablemente no se habría hecho si hubiera una simple toArray().
org.JSONArrayusa una ArrayList debajo del capó ...The arrayList where the JSONArray's properties are kept, por lo que la mayoría de los bucles se hacen por nada en muchos casos (solo por la encapsulación)