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?


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

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

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

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)


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

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

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.


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

...

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

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

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

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("\",\"");

-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.


-3

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.