Android y Json

Tengo un tiempito loco así que escribo esta entrada😀

En la entrada anterior, vimos como crear un login de usuario consultando un servidor, y dependiendo de la respuesta entramos o no al sistema. La respuesta era super simple y no escribí nada sobre JSON o cómo entenderlo… por lo que ahora vamos a verlo.

JSON es una forma de almacenar información de manera ligera. En JSON lo que se guardan son objetos, pero en texto plano. Se organiza de tal manera que es relativamente simple entender en todo momento qué es lo que tenemos🙂

Todo objeto comienza con su nombre (dah😯 ), seguido por : y luego sus atributos dentro de llaves {}. Al ser objetos, puedes tener objetos dentro de objetos, o arreglos de objetos. Los objetos deben ir entre comillas (” “) para identificar su nombre; de la misma forma sus valores, a menos que sean números.

En el ejemplo anterior (del login) teníamos la siguiente estructura

{"mensaje": {"Estado": "OK", "Unidad": "Pintura", "CodUnidad": 5}}
{"mensaje": {"Estado": "ERROR", "Mensaje": "Pass incorrecta."}}

Leyendo a la rápida, para la primera tenemos el objeto mensaje, con 3 atributos (objetos):

  1. Estado, con su valor OK.
  2. Unidad, valor Pintura
  3. CodUnidad, valor 5

Y el segundo se llama igual, con sus respectivos atributos.

Veamos un ejemplo más largo e incluyendo más datos (La identación no es necesaria, pero lo hice para visualizarlo más rápido😀 ).

{
  "Ordenes": [
    {
      "Orden": {
	"id": 5,
	"Nombre": "5162310 Reparación cubierta Principal - Según Inspección",
	"Descripcion": "Reparación cubierta Principal - Según Inspección",
	"Proyecto": "BP FIORELLA"
      }
    },
    {
      "Orden": {
	"id": 4,
	"Nombre": "5162240 Cambiar plancha casco sector tunel + canaletas enfriamiento",
	"Descripcion": "Cambiar plancha casco sector tunel + canaletas enfriamiento",
	"Proyecto": "BP FIORELLA"
      }
    },
    {
      "Orden": {
	"id": 3,
	"Nombre": "5162210 Nuevo Doble fondo",
	"Descripcion": "Nuevo Doble fondo",
	"Proyecto": "BP FIORELLA"
      }
    },
    {
      "Orden": {
	"id": 2,
	"Nombre": "5162230 Nuevo Forro tunel",
	"Descripcion": "Nuevo Forro tunel",
	"Proyecto": "BP FIORELLA"
      }
    },
    {
      "Orden": {
	"id": 1,
	"Nombre": "5162220 Bases Descansos Linea de eje",
	"Descripcion": "Bases Descansos Linea de eje",
	"Proyecto": "BP FIORELLA"
      }
    }
  ],
  "Proyectos": [
    "BP FIORELLA"
  ]
}

Tenemos 2 objetos en este JSON: Ordenes y Proyectos. Los 2 son objetos de Arrays. Los JSONArray comienzan con [], y se separan por , . El primero es un arrays de objetos y el segundo un array de strings.

Para el primero (Ordenes) podemos notar que es un array de objetos porque cada valor del array comienza con { , a diferencia de Proyectos que solo contiene un atributo.

Árbol

Esa fue la salida… pero cómo se hizo?😯

Al ser esto un archivo de texto, puede crearse concatenando un String o usando la librería Json. Concatenar un String es lo más cómodo si tenemos una estructura corta (como la del login), teniendo cuidado de ubicar bien las llaves. Pero si es algo más elaborado, lo mejor es usar las herramientas que nos entrega Json con json.put😀

Imaginemos que estamos en un servlet, y nos ha llegado una petición para entregar la estructura de arriba. La forma de llenarlo, es de adentro hacia afuera: Comenzando por el objeto orden, dentro del array del objeto ordenes.

Entonces creamos el objeto json de la clase JSONObject (suponiendo que están siguiendo el link de arriba. Aquí vamos a contener todo.

Ahora creamos 2 objetos más, de la clase JSONArray: proyectos  y ordenes. Empezando por el más fácil (proyectos) insertamos un valor por cada String. En el ejemplo de arriba solo tengo un elemento, pero si fueran más, quedaría algo así:

//Array con todos los valores a agregar
ArrayList<String> Arrayproyectos = new ArrayList<String>();
Arrayproyectos.add("Proyecto 1"); Arrayproyectos.add("Proyecto 2"); Arrayproyectos.add("Proyecto 3");
//Iteramos e ingresamos cada elemento a el JsonArray
for(String s : Arrayproyectos){
   proyectos.put(s);
}

Y obtenemos algo así:
[Proyecto 1, Proyecto 2, Proyecto 3]

Teniendo nuestro JsonArray proyectos listo, lo agregamos al contenedor json de la misma manera, pero agregando un parámetro que determina el nombre del valor.

json.put("Proyectos", proyectos);

Y de esta forma ya tenemos el primer elemento en nuestro contenedor.

Para ingresar el array ordenes, se hace de la misma manera, pero combinando entre array y objeto. Algo así

/*Suponiendo que vamos a ingresar 5 objetos al array */
JSONArray ordenes = new JSONArray();
for(int i=0; i<5; i++){
//Primero llenamos el objeto orden
   JSONObject orden = new JSONObject();
   orden.put("id", VARIABLE_CON_ID);
   orden.put("Nombre", VARIABLE_CON_NOMBRE);
   orden.put("Descripcion", VARIABLE_CON_DESCRIPCION);
   orden.put("Proyecto", VARIABLE_CON_PROYECTO);
//Ahora que lo llenamos, lo metemos en el array
   ordenes.put(orden);
}
//Ya que salimos del for, tenemos 5 ordenes en el array.
//Metemos el array en el contenedor
json.put("Ordenes", ordenes); 

Y esa es toda la ciencia🙂 de esta manera generamos el json. Podemos hacer lo mismo cuantas veces queramos, logrando muchos más niveles de profundidad.

Con esto terminamos la generación del json en el servidor. Vamos ahora a Android para leerlo, aunque se hace de la misma manera, pero a la inversa😀

//Creamos el objeto JSONObject y lo instanciamos con el string entregado por el servidor.
//Lo mismo que la entrada pasada.
JSONObject job = new JSONObject(stream.toString());
//Creamos los JSONArrays
JSONArray ordenes = new JSONArray(job.getJSONArray("Ordenes").toString());
JSONArray proyectos = new JSONArray(job.getJSONArray("Proyectos").toString());
//Recorremos el primer JSONArray
for(int i = 0; i < ordenes.length(); i++){
   //Creamos el objeto para leer lo que viene en la posición i
   JSONObject orden = ordenes.getJSONObject(i);
   //Creamos el objeto orden propiamente tal
   JSONObject o = orden.getJSONObject("Orden");
   //Accedemos a los valores
   int id = o.getInt("id");
   String nombre = o.getString("Nombre");
   //....
}

//Para leer el Array proyectos, lo mismo
for(int i = 0; i < proyectos.length(); i++){
   String proyecto = proyectos.getString(
}

🙂

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Android, Java, Tutoriales. Guarda el enlace permanente.

10 respuestas a Android y Json

  1. Anónimo dijo:

    Buen tuto viejo, seria bueno unas capturas de pantalla para ver el script en acción, slds de México.

  2. ad dijo:

    Buen tuto viejo, seria bueno unas capturas de pantalla para ver el script en acción, slds de México.

  3. Anónimo dijo:

    Buena info doc! pero deverias poner el link de tu anterior post para relacionar los tutos, saludos!!

  4. Carlos dijo:

    Gracias!!!!

  5. Luis Ángel dijo:

    Excelente tutorial, sencillo y claro!!
    Gracias!

  6. Marcela dijo:

    me salvaste la vida! Gracias u.u
    Magnifico tutorial…las caritas lo hacen mas ameno🙂

  7. genial! pero en caso de tener un objeto que tiene un arreglo que tiene objetos con arreglos dentro…. como acceso a esas cadenas?

  8. Hola compañero, muy buen tutorial, yo obtengo los datos por url y los trae y aunque tienen el mismo formato que el ejemplo y utilizo ese mtodo para traerlos, no me los muestra alguna ayuda??
    dejo el codigo
    //json
    {
    “total_inmuebles”:”133″,
    “error”:0,
    “inmuebles”:[
    {
    “datos”:{
    “nuId”:”5163″,
    “nuCodigo”:”112899″,
    “sbDireccion”:”ASQ”,
    “sbCiudad”:”Cali”,”sbDepartamento”:”Valle del Cauca”,
    },
    “datos”:{
    “nuId”:”5163″,
    “nuCodigo”:”112899″,
    “sbDireccion”:”ASQ”,
    “sbCiudad”:”Cali”,”sbDepartamento”:”Valle del Cauca”,
    }
    }
    ]
    }

    java
    //obtiene json de la url
    JSONObject jsonObj = new JSONObject(EntityUtils.toString(response.getEntity()));
    JSONArray jsonObjInm = new JSONArray(jsonObj.getJSONArray(“inmuebles”).toString());
    for(int i=0; i < jsonObjInm.length(); i++) {
    JSONObject inmuebles = jsonObjInm.getJSONObject(i);
    JSONObject datos = inmuebles.getJSONObject("datos");
    String direccion = datos.getString("sbDireccion");
    String departamento = datos.getString("sbDepartamento");
    listas.add(new Lista_entrada("https://38.media.tumblr.com/0e8061f7de8927c295d2e3886c885e04/tumblr_newe8xWmDw1tq3ao7o1_1280.jpg&quot;, ciudad, direccion));
    }

    • el mostrar lo que trae en el EntityUtils.toString(response.getEntity()) parece que me mocha el array ps lo veo en consola y esta incompleto(su contenido es mucho mas largo que el posteado) no me muestra nisiquiera el primer registro completo sera eso? y como podia traerlos completos?

  9. Miguel dijo:

    Muy Agradecido

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s