2010-09-03 6 views
13

Comencé a construir una aplicación de Android que utiliza un archivo plano para el almacenamiento. La aplicación no almacena más de seis registros, y estoy familiarizado con JSON, así que simplemente escribo un JSONArray en el archivo.¿Por qué no hay un método remove (int position) en JSONArray de Android?

Acabo de descubrir hoy, sin embargo, que la API de Android JSON no incluye una opción remove(). ¿Huh? ¿Tengo que volcar la matriz en otra colección, eliminarla y luego reconstruir el JSONArray? ¿Cuál es el punto de?

+2

stackoverflow es para preguntas y respuestas de programación. Las quejas sobre la API de JSON deben dirigirse a los autores, que están en json.org. O bien, dado que es de código abierto, puede modificarlo y utilizar la versión modificada usted mismo. – CommonsWare

+3

En realidad, este es un problema SDK de Android. Destaque el problema aquí para que alguien lo aplique: https://code.google.com/p/android/issues/detail?id=53461 – Mark

Respuesta

6

El punto es que JSONArray y JSONObject están destinados a (de) serializar datos a JSON, no manipular datos. Un método remove() puede parecer tener sentido, pero ¿dónde está el límite? ¿Esperaría poder acceder a los atributos en objetos serializados? Acceder o actualizar estructuras de datos anidados?

La idea es, de hecho, que manipule las estructuras de datos "de forma nativa".

+0

Esto tiene sentido. En mi caso, tengo un almacén de datos que consiste en un objeto de datos simple (POJO, Bean, como quiera llamarlo) y List. Debería tratar estos objetos directamente, y luego escribir su estado a través de JSON. – alalonde

+1

Tiene una API pública, no puede simplemente eliminar aleatoriamente funciones de ella solo porque piensa que su forma de codificación es mejor. – Mark

+3

Creo que la API org.json se creó hace más de 15 años. ¿Por qué no permitir que las personas vuelvan a ordenar una matriz de JSONObject que se obtuvieron de Internet? ¿Por qué es obligatorio crear una lista en lugar de reordenar el JSONArray directamente? bucles de bucles solo por hacer lo mismo. –

19

Esto es útil a veces en Android cuando se quiere usar la estructura json directamente, sin dar vueltas para convertir. Utilice esto solo cuando hace cosas como eliminar una fila en clics largos o algo así. ¡No lo use dentro de un bucle!

Observe que solo uso esto cuando manejo JSONObject dentro de la matriz.

public static JSONArray remove(final int idx, final JSONArray from) { 
    final List<JSONObject> objs = asList(from); 
    objs.remove(idx); 

    final JSONArray ja = new JSONArray(); 
    for (final JSONObject obj : objs) { 
     ja.put(obj); 
    } 

    return ja; 
} 

public static List<JSONObject> asList(final JSONArray ja) { 
    final int len = ja.length(); 
    final ArrayList<JSONObject> result = new ArrayList<JSONObject>(len); 
    for (int i = 0; i < len; i++) { 
     final JSONObject obj = ja.optJSONObject(i); 
     if (obj != null) { 
      result.add(obj); 
     } 
    } 
    return result; 
} 
+1

Funciona como un encanto. – Ceetn

+1

Muchas gracias por el código. – Magicode

7

Es posible que desee comprobarlo ahora. Parece que API 19 de Android (4.4) realmente permite este método.

Call requires API level 19 (current min is 16): org.json.JSONArray#remove 

Recibí ese error al intentar usarlo. Espero que te ayude, ¡ahora que está ahí!

10

que utilizo:

public static JSONArray RemoveJSONArray(JSONArray jarray,int pos) { 
    JSONArray Njarray=new JSONArray(); 
    try{ 
     for(int i=0;i<jarray.length();i++){   
      if(i!=pos) 
      Njarray.put(jarray.get(i));  
      } 
     }catch (Exception e){e.printStackTrace();} 
    return Njarray; 
} 
+0

Esta solución funciona bien para mí cuando necesita eliminar una fila en API <19 –

Cuestiones relacionadas