Convertir Json Array a la lista normal de Java

130

¿Hay alguna manera de convertir JSON Array a Java Array normal para el enlace de datos Android ListView?

Houston, tenemos un problema
fuente
8
Lo curioso es que 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)
Christophe Roussy

Respuestas:

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
fuente
55
para el bucle falta el paréntesis de cierre ... intenté editarlo pero no hay suficientes caracteres para aprobar. ¡Oh bien! solo un FYI.
Matt K
En realidad no falta, el respondedor simplemente pegó un trozo de código con las llaves de apertura y cierre de la función.
Sarim Javaid Khan
1
¿Qué sucede si jsonArray.get(i)devuelve nulo (como resultado de analizar esto [ "String 1", null, "String 2" ])? ¿No se estrellaría entonces tu bucle for?
dbm
Gracias. Si uno tiene sring, JSONArray se puede crear como JSONArray jsonArray = new JSONArray (yourString); El resto del código seguirá siendo el mismo.
Kaushik Lele
Dependiendo de la implementación que pueda necesitar en size()lugar de length().
Guillaume F.
57

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) );
}
Mella
fuente
2
Lo siento, tienes razón: estoy confundiendo las listas con JSONArrays :) De hecho, es JSONArray.length ().
Nick
13

En lugar de usar la org.jsonbiblioteca incluida , intente usar Jackson o GSON, donde se trata de una frase. Con Jackson, f.ex:

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

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)

Guido Sabatini
fuente
8
Tenga en cuenta que debe estar absolutamente seguro de que los datos no contienen su separador de caracteres, de lo contrario, terminará con datos corruptos.
Artemix
1
y el resultado tiene que ser una cadena.
Nicolas Tyler
Un forro, perfecto.
zeeshan
4

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);
}
nurnachman
fuente
3

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());
Samuel Philipp
fuente
0

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.

pchot
fuente
0

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

...
Joolah
fuente
0

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;
}
ceph3us
fuente
0

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

usuario10878560
fuente
0

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("\",\"");
Mayank Yadav
fuente
-2

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.

Johannes Barop
fuente
-3

¿Qué hay de usar java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())
Michal Tsadok
fuente
15
No veo un 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().
javajavajavajavajava
1
net.sf.json.JSONArray tiene el método toArray (), por lo que esta respuesta funciona para esta biblioteca JSON. La pregunta no especificaba la biblioteca utilizada.
ilinca