Android. Leyendo JSON desde un servicio web


Desde Android y en general desde tecnología de desarrollo para móviles, el uso de interfaces o librerías para atacar a bases de datos es totalmente imposible por varias razones:
  • La principal es para evitar problemas de seguridad. Un usuario que está más o menos registrado realizaría accesos a la base de datos, al final, lo más importante de las aplicaciones de una forma directa y no controlada
  • Escalabilidad y mantenimmiento. Tener el desarrollo preparado para realizar todo el proceso contra una tecnología de base de datos no proporciona la escalabilidad para poder realizar cambios o mejoras
Por este motivo es necesario poder realizar consultas a servicios en la nube que nos permita devolver contenido e incorporar a nuestra aplicación. Y actualmente el protocolo más legible, rápido y fácil de incorporar es el uso de JSON

Conexión al servicio
El primer e importante paso es conectarnos al servicio web o API que nos proporcione los datos necesarios, es decir el JSON para comenzar a tratar los datos.
Para ello utilizaremos los datos que nos proporciona el ayuntamiento de Valencia en el Portal de datos abiertos, y en concreto utilizaremos los datos referentes a las cámaras de tráfico y seguridad de Valencia.
Y ¿cómo hacemos esto? Pues tan sencillo o complicado como utilizando la clase AsynTask y HttpURLConnection de Android. El código en concreto sería el siguiente acompañado por supuesto de la explicación en vídeo:
// Setup the connection with the DB
        //Esta clase realizará la conexión devolviendo el JSON
        @Override
        protected JsonReader doInBackground(String... args) {
            String temp = "";
            try {
                URL url = new URL(urlCamaras);
                urlConnection = (HttpURLConnection) url.openConnection();
                temp = urlConnection.getResponseMessage();
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
                CameraJSONReader cJSONReader=new CameraJSONReader();
                try {
                    camaras = cJSONReader.readJSONMsg(reader);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (urlConnection != null) urlConnection.disconnect();
                return reader;
            }
        }


Parseando el JSON
El segundo paso es parsear los datos de acuerdo a nuestras necesidades y la estructura del JSON, para este procedimiento no existe un único método ni mecanismo de realizar el proceso ya que el objetivo, la aplicación y el documento JSON serán diferentes
En nuestro caso planteamos un ejemplo haciendo uso de la clase JSONReader, que permite avanzar y parsear el Buffer recogido de la conexión
Un trozo de ejemplo sería el siguiente, aunque para entender correctamente su funcionamiento es mejor visualizar el vídeo:
// Setup the connection with the DB
        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            Log.i("MENSAJE","LLEGO A JSON");
            if (name.equals("features")) {
                //Estamos en el array de camaras
                Log.i("MENSAJE","ENTRO EN FEATURES");
                reader.beginArray();
                while (reader.hasNext()) {
                    camaras.add(readCamara(reader));
                    Log.i("MENSAJE","CAMARA AÑADIDA");
                }
                reader.endArray();
            }else {
                reader.skipValue();
            }
        }


Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
CÓDIGO EN GITHUB

Share this

Related Posts