JSON en Java utilizando la biblioteca com.google.gson

Como ya se trató en post anteriores, JSON no es más que un formato de transmisión de información que es de especial utilidad cuando interviene algún script escrito en Javascript.

En un principio para la comunicación entre sistemas de diferente naturaleza XML parecía ser un lenguaje adecuado, pero su excesivo formalismo y poca eficiencia en el proceso de parseado provocó que se empezara a utilizar JSON par transmitir los mismos datos. Se puede encontrar un ejemplo en el artículo correspondiente de la wikipedia

Al fin y al cabo, como digo, JSON no es más que una cadena de texto que contiene los valores de los atributos de un objeto. El formato que debe cumplir se puede encontrar en json.org.

En este post centraremos la atención de la transformación de texto en JSON a objeto de Java y viceversa. Esta es una tarea sencilla pero tediosa, ya que hay que escribir código para pasar a texto o parsear el texto, algo que nunca nos gusta a los programadores porque siempre se acaba poniendo condiciones poco elegantes. Aquí un ejemplo de un post anterior, en el que se genera una cadena de texto en formato JSON que contiene un array de objetos

String parametro;
StringBuilder salida = new StringBuilder();
int contador = 0;

while (enumeration.hasMoreElements()) {
	contador++;
	parametro = enumeration.nextElement();
	System.out.println("Parámetro " + parametro + ": " + request.getParameter(parametro).toString());

	//Escribe a la salida de forma directa
	salida.append("{\"Parametro\":\"" + parametro + "\",\"Valor\":\"" + request.getParameter(parametro).toString() + "\"},");
}

//Quita la coma final poruqe sobra al ser un array
salida.deleteCharAt(salida.length()-1);

if (contador > 1) {
	salida.insert(0, "[");
	salida.append("]");
}

System.out.println("Salida:" + salida);

Afortundamente existen librerías en java para llevar a cabo esta labor con el esfuerzo mínimo. En la web json.org se pueden ver librerías para todos los lenguajes.

En este caso se va a utilizar la librería gson de Google, que como todos los proyectos tiene su documentación propia. En este ejemplo se da una muestra básica de su uso, para información más detallada conviene visitar la documentación del sitio oficual.

Aquí muestro un ejemplo sencillo de uso con una inner class llamada Persona, que está al final del código. Esta clase solamente tiene dos atributos, nombre y edad, que será la información que se incluye en el texto en formato JSON. Los pasos del código son los siguientes:

  1. Paso de Objeto Java a JSON
    1. Creación del objeto gson de la clase Gson, que contiene los métodos para realizar las conversiones.
    2. Creación de un ArrayList de 3 objetos Persona de prueba, que serán convertidos a JSON.
    3. Obtención de la equivalencia en JSON del array de personas mediante gson.toJson(prueba1Array);
  2. Paso de JSON a Objeto Java
    1. Definición de una cadena de texto que contiene los atributos de un objeto persona según la especificación JSON
    2. Obtención del objeto equivalente de Java mediante gson.fromJson(personaEnJson, Persona.class). Se debe indicar en el segundo parámetro la clase del Objeto, en este caso Persona.class, lo que obliga a disponer de un constructor sin parámetros para dicha clase

El código fuente es el siguiente:

import com.google.gson.Gson;
import java.util.ArrayList;

/**
 *
 * @author Alberto Moratilla alberto.moratilla@gmail.com
 */
public class pruebaGson {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        pruebaGson pgs = new pruebaGson();
        Gson gson = new Gson(); //Objeto que lleva a cabo las operaciones de transformación


        //1. Conversión de un ArrayList de Objetos a JSON
        ArrayList prueba1Array = new ArrayList();
        for (int i = 0; i < 3; i++) {
            prueba1Array.add(new Persona("Nombre_" + i, i));
        }

        String salidaFormatoJSON = gson.toJson(prueba1Array);
        System.out.println("Conversión a JSON:" + salidaFormatoJSON);

        //2. Paso de JSON a objeto predefinido
        String personaEnJson = "{\"nombre\":\"Manolo\",\"edad\":32}";
        Persona personaFromJson = gson.fromJson(personaEnJson, Persona.class);

        System.out.println("Persona Cargada desde JSON. Nombre:" + personaFromJson.nombre + "Edad:" + personaFromJson.edad);
    }

    //Inner class
    private static class Persona {

        String nombre;
        int edad;

        //Necesario para el método fromJson
        public Persona() {}

        public Persona(String n, int e) {
            nombre = n;
            edad = e;
        }
    }
}

La salida de dicho programa coincide con las conversiones esperadas:

Conversión a JSON:[{"nombre":"Nombre_0","edad":0},{"nombre":"Nombre_1","edad":1},{"nombre":"Nombre_2","edad":2}]
Persona Cargada desde JSON. Nombre:ManoloEdad:32
Anuncios

One comment

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