Posts tagged ‘JSON’

JSON ¿Qué librería elegir?

Hoy en día se ha puesto de moda el formato JSON para el intercambio de la información entre el cliente y el servidor. En la actualidad existen varias librerías para pasar transformar un objeto Java en una cadena JSON (serialización) o viceversa (deserialización). Por lo que yo he visto hasta la actualidad, ninguna de las grandes sociedades del software libre (Apache, Sun, Jboss …) tienen una librería open source para Java que nos haga de parser el formato JSON.

Apache en tuvo una iniciativa con la creación del proyecto Noggit, pero esta iniciativa parece un poco parada, en la actualidad este proyecto sigue en el Labs de Apache, pero no tiene ningún movimiento.

Desde la página en donde se encuentra la especificación de JSON [1] se indican las librerías más conocidas para tratar/generar información relativa al formato JSON en los diferentes lenguajes de programación. A continuación paso a comparar las librerías que en mi opinión son las dos librerías más destacables:

FLEXJSON [2] vs JSON-lib [3]

Funcionalidades:

Ambas librerías permiten la serialización de objetos Java en formato JSON, de la misma forma en ambos casos se permite excluir los atributos que van a ser serializados.

Ventajas de flexjson:

  • Permite ‘expresiones regulares’ en los excludes. Se permiten el carácter ‘.’ para navegar por los atributos de los objetos relacionados y la utilización de ‘*’ para excluir a todos los atributos.
  • Tiene dos tipos de serializacón DEEP (todos los atributos)y SHALLOW (sólo los atributos básicos directos). Esto evita tener que excluir la mayoría de las colecciones, información que frecuentemente no es enviada o es tratada de forma independiente.
  • Permite indicar los atributos que han de ser serializados o no mediante anotaciones en las clases. Por defecto todos los atributos son serializados.
public class User {
    private String login;
    private String password; 

    @JSON(include=false)
    public String getPassword() { }
}
  • Permite indicar los atributos que queremos que sean serializados, es decir, permite la utilización de includes. Esta es una funcionalidad permite modificar la anotación del dominio o el tipo de serialización utilizado. Esta funcionalidad junto con la previa exclusión de todos los atributos, nos permite indicar aquellos atributos que únicamente han de ser serializados.

Ejmeplo:

 new JSONSerializer().exclude("*").include("atributo1.subAtributo3", "atributo2").serialize(p);
  • Por defecto tiene definido un filtro que evita el error de LazyInicialization de Hibernate, de tal manera que intenta obtener el atributo de la BD.

Ventajas de json-lib:

  • Permite diferentes estrategias a la hora de detección de ciclos.
  • Implementan JSONRCP, es decir, permite la serialización de funciones.
  • Permite la transformación desde XML a JSON y viceversa. En el caso de que utilicemos ambos formatos, esta es una función a tener muy en cuenta.

Ejemplo:

  // Transformación en XML.
  JSONArray json = (JSONArray) XMLSerializer.read( xml );  
  // Transformación en JSON desde XML.
  String xml = XMLSerializer.write( json );
  • Permite la deseralización, es decir, el paso de cadena JSON a un objeto Java. Esta funcionalidad actualmente está en desarrollo en la librería FLEXJSON, aunque es esperada en la versión 2.0.
  • Tiene un módulo para la integración con Groovy.

Dependencias:

A la hora de analizar una librería es conveniente ver las dependencias y su tamaño. Esto influirá en la memoria utilizada y en el tamaño de nuestra aplicación. Este dato a tener en cuenta, aunque no es un factor decisivo.

En este aspecto la librería flexjson es una la librería de peso ligero, es decir, todas sus dependencias son satisfechas por la máquina virtual de Java. A esto hay que añadirle que sólo ocupa 40K.

En el caso de la librería json-lib, son necesarias un conjunto de dependencias, lo cual hace que aumente considerablemente el tamaño (238K). Las librerías de las que depende este proyecto son:

  • jakarta commons-lang 2.4
  • jakarta commons-beanutils 1.7.0
  • jakarta commons-collections 3.2
  • jakarta commons-logging 1.1.1
  • ezmorph 1.0.6

Eficiencia:

Tras realizar un conjunto de pruebas para la serialización y deserialización de objetos llegué a las siguientes conclusiones:

  • En el caso de que los objetos sean simples, es decir, sólo serializamos los atributos que dependen directamente del padre se obtiene una mejora de un 6-5% en la librería flexjson.
  • En el caso en el que los objetos son complejos, es decir, hay colecciones de objetos, arrays y dependencias de objetos, obtenemos un resultado de un 20-25% de mejoras entre las diferentes serializaciones.

Nota: Estas pruebas se hicieron sobre una máquina virtual 1.6 en linux.

Simplicidad:

En el caso de flexjson, la API es bastante sencilla, ya que sólo requiere conocimiento del manejo de una par de clases para la personalización de los atributos que queremos personalizar además son es bastante intuitiva. Este código es muy flexible y fácil de extender, en cambio en json-lib las cosas se complican un poco ya que para obtener unas funcionalidades parecidas a las que proporciona flexjson es necesario la declaración de filtros y complicar un poco el desarrollo, de todas formas la serialización es básica es igual de simple de utilizar que en flexjson.

Otra ventaja es que flexjson tiene ya implementado un conjunto de filtros para procesar valores concretos (Objetos de Hibernate, Escapar etiquetas HTML, formatear las fechas).

Otros puntos:

  • Flexjson sólo puede ser utilizada en aplicaciones que corran sobre la versión 1.5 o posterior de la máquina virtual, en cambio json-lib tiene una implementación que corre sobre la máquina virtual 1.3 y otra sobre la 1.5.
  • La configuración de json-lib por defecto tiene un fallo a la hora de procesar las cadenas con valor null, ya que las interpreta como nulas. Esto puede ser corregido mediante la definición de un filtro.
  • La comunidad de de json-lib es más amplia tiene un equipo de desarrolladores bastante nutrido, por ello sacan versiones con relativa frecuencia. En cambio flexjson es desarrollada principalmente por Charlie Hubbard aunque está abierto a nuevas sugerencias.
  • Ambos proyectos están contruidos con maven, aunque la librería json-li se encuentra en el repositorio oficial de maven.

Conclusión:

En mi opinión, si vas a utilizar JSONRCP, en tu aplicación usas tanto XML como JSON, o utilizas deserialización(en desarrollo para flexjson) recomendaría que utilizaras json-lib. En cualquier otro caso mi recomendación es la utilización de flexjson. Esta librería está bastante orientada al uso de EXTJS y las funcionalidades son mayores en este aspecto.

[1] http://www.json.org

[2] http://flexjson.sourceforge.net/

[3] http://json-lib.sourceforge.net/

miércoles,7 enero, 2009 at 1:42 3 comentarios


Feeds