Procesando JSON con la librería org.json

 

La librería org.json permite, tanto, codificar datos en formato JSON dentro de un String, como el proceso inverso. Una de sus ventajas es que esta librería ya se encuentra integrada en la plataforma Android.

Para trabajar con esta librería hay que realizar el proceso de conversión manualmente, insertando cada elemento de uno en uno. Esto puede darnos más trabajo que otras librerías como GSON, pero, al no ser un proceso automático, vamos a poder realizarlo de forma personalizada. Por ejemplo, podremos elegir el orden en que se generan los datos.

Ejercicio: Guardar puntuaciones en JSON con la librería org.json.

1.     Crea la clase AlmacenPuntuacionesJSon con el  siguiente código:

 public class AlmacenPuntuacionesJSon implements AlmacenPuntuaciones {
   private String string; //Almacena puntuaciones en formato JSON

   public AlmacenPuntuacionesJSon() {
      guardarPuntuacion(45000,"Mi nombre", System.currentTimeMillis());
      guardarPuntuacion(31000,"Otro nombre", System.currentTimeMillis());
   }

   @Override
   public void guardarPuntuacion(int puntos, String nombre, long fecha) {
      //string = leerString();
      List<Puntuacion> puntuaciones = leerJSon(string);
      puntuaciones.add(new Puntuacion(puntos, nombre, fecha));
      string = guardarJSon(puntuaciones);
      //guardarString(string);
   }

   @Override
   public Vector<String> listaPuntuaciones(int cantidad) {
      //string = leerFichero();
      List<Puntuacion> puntuaciones = leerJSon(string);
      Vector<String> salida = new Vector<>();
      for (Puntuacion puntuacion: puntuaciones) {
         salida.add(puntuacion.getPuntos()+" "+puntuacion.getNombre());
      }
      return salida;
   }

   private String guardarJSon(List<Puntuacion> puntuaciones) {
      String string = "";
      try {
         JSONArray jsonArray = new JSONArray();
         for (Puntuacion puntuacion : puntuaciones) {
            JSONObject objeto = new JSONObject();
            objeto.put("puntos", puntuacion.getPuntos());
            objeto.put("nombre", puntuacion.getNombre());
            objeto.put("fecha", puntuacion.getFecha());
            jsonArray.put(objeto);
         }
         string = jsonArray.toString();
      } catch (JSONException e) {
          e.printStackTrace();
      }
      return string;
   }

   private List<Puntuacion> leerJSon(String string) {
      List<Puntuacion> puntuaciones = new ArrayList<>();
      try {
         JSONArray json_array = new JSONArray(string);
         for (int i = 0; i < json_array.length(); i++) {
            JSONObject objeto = json_array.getJSONObject(i);
            puntuaciones.add(new Puntuacion(objeto.getInt("puntos"),
                objeto.getString("nombre"), objeto.getLong("fecha")));
         }
      } catch (JSONException e) {
         e.printStackTrace();
      }
      return puntuaciones;
   }
}

2.     Modifica el código necesario para que se pueda seleccionar este tipo de almacenamiento.

3.     Si has realizado la práctica anterior, introduce los métodos guardarString() leerString().

4.     Ejecuta el proyecto y verifica su funcionamiento.

NOTA: Acabamos de ver dos alternativas para serializar los datos contenidos en un objeto, XML y JSON. Existe otra alternativa aportada por en lenguaje Java, que consiste en implementar el interface Serializable [1]. Aunque resulta muy sencillo de utilizar, también presenta algunos inconvenientes: La serialización ocupa mucho espacio[2] (demasiado para transacciones por Internet), el formato obtenido es binario (no es visible o editable por un usuario) y solo se implementa en Java (no podemos interoperar con servidores con otros lenguajes). 

Preguntas de repaso: Trabajando con JSON