Páginas

martes, 13 de diciembre de 2016

Comparativa librerías JSON: Gson y Jackson

Para manipular datos en formato JSON existen dos librerías: Jackson y Gson. La primera es muy conocida por ser el 'motor' usado por el framework Jersey de Web Services RESTfull, la segunda no lo es tanto.

El presente ejemplo tiene como finalidad comparar el rendimiento de ambas. Tras unas primeras pruebas con POJOS java de diversos tamaños me da la sensación de que Jackson es un poquitín mas rápida.

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

public class TestMotoresJSON {

 private static final int NUMCLIENTES = 5;
 private static final int NUMFACTURAS = 100000;
 
 private static final Gson motorGSON = new GsonBuilder().create();
 private static final ObjectMapper motorJACKSON = new ObjectMapper();
 
 public static void main(String[] args) throws IOException {

  //Montamos un pojo Java con la lista de clientes y facturas
  final List lstClientes = montaListaClientes();

  //Serializo GSon
  long tmp = System.currentTimeMillis();
  String lstClientesJSON = serializoGSon(lstClientes);
  System.out.println("Tiempo serialización GSon:"+(System.currentTimeMillis()-tmp));

  //Deserializo GSon
  tmp = System.currentTimeMillis();
  deserializoGSon(lstClientesJSON);
  System.out.println("Tiempo deserialización GSon:"+(System.currentTimeMillis()-tmp));
  
  //Serializo Prueba
  tmp = System.currentTimeMillis();
  lstClientesJSON = serializoJackson(lstClientes);
  System.out.println("Tiempo serialización Jackson:"+(System.currentTimeMillis()-tmp));
  
  //Deserializo Prueba
  tmp = System.currentTimeMillis();
  deserializoJackson(lstClientesJSON);
  System.out.println("Tiempo deserialización Jackson:"+(System.currentTimeMillis()-tmp));
 }
 
 private static String serializoGSon(final List lstClientes){
   
  return motorGSON.toJson(lstClientes);
 }
 
 private static void deserializoGSon(final String lstClientesJSON){
  
  motorGSON.fromJson(lstClientesJSON, new TypeToken>(){}.getType());
 }
 
 private static String serializoJackson(final List lstClientes) throws IOException {

  return motorJACKSON.writeValueAsString(lstClientes);
 }
 
 private static void deserializoJackson(final String lstClientesJSON) throws IOException {
  
  motorJACKSON.readValue(lstClientesJSON, motorJACKSON.getTypeFactory().constructCollectionType(ArrayList.class, Cliente.class));
 }
 
 private static List montaListaClientes(){
  
  final List lst = new ArrayList();
  Cliente cliente = null;
  Factura fac = null;
  for (int c=0;c());
   for (int f=0;f
Necesitaremos las clases de apoyo:
import java.util.List;

public class Cliente {

 private String CIF;
 private String nombre;
 private String direccion;
 private String email;
 private String telefono;
 private String fax;
 private List facturas;
 
 public String getCIF() {
  return CIF;
 }
 public void setCIF(String cIF) {
  CIF = cIF;
 }
 public String getNombre() {
  return nombre;
 }
 public void setNombre(String nombre) {
  this.nombre = nombre;
 }
 public String getDireccion() {
  return direccion;
 }
 public void setDireccion(String direccion) {
  this.direccion = direccion;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 public String getTelefono() {
  return telefono;
 }
 public void setTelefono(String telefono) {
  this.telefono = telefono;
 }
 public String getFax() {
  return fax;
 }
 public void setFax(String fax) {
  this.fax = fax;
 }
 public List getFacturas() {
  return facturas;
 }
 public void setFacturas(List facturas) {
  this.facturas = facturas;
 }
}

public class Factura {

 private String id;
 private String fecha;
 private long bruto;
 private long neto;
 private long iva;
 
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getFecha() {
  return fecha;
 }
 public void setFecha(String fecha) {
  this.fecha = fecha;
 }
 public long getBruto() {
  return bruto;
 }
 public void setBruto(long bruto) {
  this.bruto = bruto;
 }
 public long getNeto() {
  return neto;
 }
 public void setNeto(long neto) {
  this.neto = neto;
 }
 public long getIva() {
  return iva;
 }
 public void setIva(long iva) {
  this.iva = iva;
 }
}

Necesitaremos importar en el pom.xml las dependencias:

     <dependencies>
          <dependency>
               <groupId>com.fasterxml.jackson.core</groupId>
               <artifactId>jackson-databind</artifactId>
               <version>2.8.5</version>
          </dependency>
          <dependency>
               <groupId>com.google.code.gson</groupId>
               <artifactId>gson</artifactId>
               <version>2.6.2</version>
          </dependency>
     </dependencies>

No hay comentarios:

Publicar un comentario