(Post preparado por Miguel Angel Madrigal, se nota en su preciosista prosa, verdad? :D, yo soy más de barrio 😉 )
Spring Roo (Si aún no sabéis lo que es Roo podéis leer algunos de estos posts del Blog) dispone de una funcionalidad realmente útil para dotar a una clase Java de la posibilidad de volcar su contenido en un String con formato JSON: @RooJson.
· Simplemente añadiendo esta anotación, la consola incorporará a nuestra clase una serie de métodos adicionales que nos servirán para trabajar con JSON.
· Entre ellos se encontrará el método toJson(), que será el encargado de generar el String que buscamos.
· También tendremos a nuestra disposición el método fromJsonToX(), donde X es el nombre de nuestra clase, que nos permitirá hacer justamente lo contrario: procesar un String en formato JSON y convertirlo en una instancia de nuestra clase.
La implementación de los métodos generados por la consola delega en FlexJson la generación y procesamiento del código JSON asociado a nuestra clase.
Si las clases que queremos convertir a JSON no pertenecen a nuestra aplicación, y por tanto, no podemos anotarlas con @RooJson, podemos usar FlexJson directamente, ya que es verdaderamente sencillo. En su página podemos encontrar más información, aunque un ejemplo sencillo podría ser este:
return new JSONSerializer().serialize(objeto);
Existe una particularidad que debemos tener en cuenta cuando trabajamos con FlexJson (ya sea directamente o a través de @RooJson): las propiedades de nuestra clase que sean una Collection, no serán convertidas a JSON por defecto.
· Es decir, FlexJson interpreta que esta propiedad contiene objetos relacionados con el objeto que queremos convertir a JSON, pero que no forman parte de su estado. Esto es muy útil si lo que queremos representar en JSON es una entidad, ya que se sigue el mismo paradigma.
· No obstante, si queremos que FlexJson tenga en cuenta este tipo de propiedades al generar el código JSON, no tenemos más que anotar el getter de esta propiedad como @JSON.
Otro punto a tener en cuenta cuando serializamos son las referencias cíclicas:
Si nuestra estructura de clases contiene referencias cíclicas podemos estar tranquilos, puesto que FlexJson las detectará y no incluirá la propiedad que cierra la referencia cíclica en el código JSON generado. Por ejemplo, si tenemos una clase Padre que tiene un Hijo, y el hijo posee a su vez una referencia a su padre, esta propiedad del hijo no será tenida en cuenta al generarse el código JSON del padre.
La detección de referencias cíclicas es una ventaja que otras tecnologías de soporte de JSON no tienen. Por ejemplo Jackson (empleada en Spring MVC para la realización de controladores Web basados en JSON) no es capaz de detectarlas, produciéndose una excepción en caso de ocurrir esta situación. Por ello, debemos ser cuidadosos a la hora de diseñar nuestras clases, haciendo que no se den referencias cíclicas, si vamos a construir controladores Web basados en JSON.
Jettison
Jettison es un parser STAX capaz de generar código JSON. Es decir, que está enfocado al procesamiento de XML y a su conversión a JSON. XStream puede configurarse para trabajar con Jettison y así, de forma conjunta, podemos traducir estructuras XML a código JSON. Un ejemplo sencillo de ello es el siguiente:
XStream xstream = new XStream(new JettisonMappedXmlDriver());
return xstream.toXML(objeto);
Esta aproximación puede resultar conveniente cuando nuestras clases tienen anotaciones JAXB, ya que a través de ellas, podremos controlar el código JSON generado.


Deja un comentario