Jugando con JSON en Java y la librería GSON. Parte 2

0
14426

Jugando con JSON en Java y la librería GSON. Parte 2

0. Índice de contenidos.

1. Introducción

Como hemos visto en el tutorial de Miguel Arlandy en Jugando con JSON en Java y la librería Gson podemos hacer montón de cosas con esta libreria, pero aún podemos hacer más!

Hay casos en los que necesitamos personalizar un poco más la serialización/deserialización ya que la traducción no es directa. Por poner un ejemplo (que usaré más adelante), quizás el receptor necesite recibir un 1 ó un 0 en vez de un true o un false.

También puede ser interesante, evitar serializar alguna propiedad de una clase. Por ejemplo, alguna propiedad en la que guardemos algún estado del objeto que sea temporal.

En este tutorial vamos a ver un ejemplo de estos dos casos, que a mí particularmente, me ha sido útil en los proyectos en los que he participado.

2. Entorno

  • Hardware
    • Mackbook Pro
      • Intel Core i7 2Ghz
      • 8GB RAM
      • 500GB HD
      • Sistema Operativo: Mac OS X (10.8.2)
  • Software
    • IntelliJ 11 Ultimate

3. Personalizar la serialización/deserialización.

Tanto para este ejemplo, como para el siguiente, vamos a utilizar el mismo modelo que ha usado Miguel en su tutorial. En este caso, en la clase SolicitudVacaciones hay una propiedad nueva «aceptadas» que usaremos para el primer ejemplo y la clase Empleado tiene otra nueva propiedad que es «campoAExcluir» que usaremos para el segundo ejemplo.

Si serializamos una instancia de la clase SolicitudVacaciones, obtendremos algo como esto:

Pero ¿Que ocurre si el receptor necesita recibir un 1 o un 0 en vez de true o false?. Tenemos varias opciones, como puede ser crear otro campo, hacer un wrapper de este objeto mapeando las propiedades a los campos que necesite el receptor, etc. Para mi, la opción más adecuada, es la personalización de la serialización, y esto es algo que GSon permite hacer de forma muy sencilla.

Si lo que queremos es personalizar la serialización, es decir, pasar de nuestro Objeto a JSON, debemos crearnos una clase que defina la serialización. El único requisito de la clase es que implemente JsonSerializer.

A continuación vemos la implementación de nuestro BooleanTypeAdapter

Como veis, la cosa no puede ser más sencilla. Como la clase implementa JsonSerializer, tenemos que implementar el método serialize, que más tarde usará gson para serializar usando nuestra implementación. Si os fijáis en el cuerpo del método, lo único que hace es comprobar si el valor recibido es un nulo, que en ese caso devuelve una cadena vacía. En otro caso, mira el contenido de la variable y devuelve un 1 o un 0 según corresponda.

El segundo paso es indicar al builder, que nos construya una instancia de Gson que utilice nuestro serializador. Esto lo hacemos usando el método registerTypeAdapter indicando que serializador (TypeAdapter) queremos usar y para que tipo.

Si ejecutamos el siguiente test, veremos que nos da un bonito verde :). Fijaros que la última propiedad (aceptadas) devuelve un 0 y no un false.

Si lo que necesitamos es el proceso inverso, es decir, si al deserializar necesitamos un true o un false y lo que recibimos es un 0 lo podemos hacer de la misma manera. La única diferencia es que en vez de implementar Serializer debemos implementar Deserializer. Os pongo como quedaría implementada la clase anterior añadiendo el método para deserializar.

y el test que valida nuestra implementación

4. Personalizar la estrategia de exclusión

Como comentaba en la introducción, hay ocasiones en los que quizás no interese serializar todas las propiedades de una clase. Por ejemplo una propiedad que guardemos un estado temporal/interno de la instancia, un valor que sea importante en el negocio de la aplicación pero no tenga sentido que se serialice.

Para conseguir evitar que serializemos propiedades, Gson permite hacerlo de manera muy sencilla. Necesitaremos crear una anotación, una clase e indicarle al constructor de Gson que utilice nuestra estrategia de exclusión.

La anotación la necesitamos para marcar las propiedades que queremos que Gson ignore.

Como vemos, la anotación no tiene nada de especial. Es una anotación que se usa en tiempo de ejecución y que está limitada a las propiedades de una clase. Esto último es importante porque Gson, al serializar un objeto, sólo mira las propiedades de la clase (no usa los getters/setters).

Una vez que tenemos nuestra anotación para marcar las propiedades, vamos a implementar nuestra estrategia de exclusión. Para ello, creamos una clase que implemente ExclusionStrategy e implementamos los dos métodos que nos proporciona la interfaz.

Con el primer método, decidimos si queremos excluir la clase entera en el momento de la serialización. En nuestro caso como solo queremos ignorar propiedades, devolvemos siempre false. El segundo método indica si debemos excluir una propiedad. Lo que está haciendo es mirar las propiedades de la propiedad que está serializando, y si la propiedad contiene la anotación que hemos creado en el paso anterior, entonces decimos que ignore esa propiedad

Por último, al igual que en los casos anteriores, le indicamos al constructor de Gson que utilice nuestra estrategia de exclusión

Hemos anotado la propiedad campoAExcluir con la anotación que hemos creado.

El siguiente test comprueba dos cosas. Primero que el objeto que vamos a serializar tiene la propiedad «campoAExcluir» con un valor inicial. La segunda es que al serializar el objeto, no aparece el contenido de la propiedad que hemos excluido.

5. Conclusiones

Poco más que añadir a las conclusiones de Miguel

Es una librería muy sencilla de usar y muy util debido a la gran cantidad de APIs REST que hay y están surgiendo. Nos simplifica de una manera muy cómoda el tratamiento de JSON desde nuestras aplicaciones, tanto la serialización como la deserialización. Además no es especialmente pesada, la versión que hemos utilizado en el tutorial ocupa alrededor de 130kbs

Para cualquier comentario, duda o sugerencia, tenéis el formulario que aparece a continuación.

Un saludo.

Dejar respuesta

Please enter your comment!
Please enter your name here