Creando un serializador para Gson personalizado

Gson es una librería de Google para serializar y deserializar clases de Java en JSON y viceversa, haciendo este proceso muy sencillo.

La transformación de una clase con atributos primitivos desde Java a JSON es sencilla. Por ejemplo, la clase palabras que tiene dos atributos:

public class Palabras implements Serializable {
private Integer id;
private String palabras;
//Continúa con el constructor, getters y setters
}

Se transformará en este código JSON:

["id":351,"palabras":"pepe"]

Este proceso se realiza de forma automática mediante el siguiente código estándar de la librería Gson, donde palabra es una palabra cuyos valores son 351 y “pepe”

Gson gson = new Gson();
String salida = gson.toJson(palabra):

Podemos encontrarnos en situaciones en las que el código de JSON deba ser modificada para adaptarse al sistema destino. Por ejemplo, si usamos una librería de Javascript que espera los resultados de JSON en un formato determinado que es diferente a nuestra implementación en Java, y además no queremos cambiar nuestra clase “Palabras” de Java porque sería perjudicial para el diseño que hemos realizado.

La solución es realizar una clase intermedia que aprovecha las prosibilidades que nos da Gson. Esta clase implementará un serializador de Gson, llamado JsonSerialize. De este modo, cuando el serializador se encuentre un objeto de tipo “Palabra”, en vez de hacer la conversión estándar, utiizará este serializador. Veamos cómo se define:

class PalabrasSerializer implements JsonSerializer<Palabras> {
public JsonElement serialize(Palabras src, Type typeOfSrc, JsonSerializationContext context) {
  JsonObject jo = new JsonObject();
  jo.add("id", new JsonPrimitive(src.getId()));
  jo.add("label", new JsonPrimitive(src.getPalabras()));
  jo.add("value", new JsonPrimitive(src.getPalabras()));

  return jo;
}

Se pueden distinguir varias partes:

  • La extensión de la clase JsonSerializer, específica para la clase “Palabra”.
  • La sobrecarga del método Serialize, que devuelve un elemento JsonElement, que será la conversión de la clase a Json completa
  • La creación de un JsonObject, que contiene los pares de atributos y valor de JSON. Esta clase desciencie de JsonElement.
  • La carga de información en el JsonObject, llamando al método .add, que tiene dos parámetros, el literal con el nombre del atributo de la clase y el valor. Nótese que no es un valor en texto, sino un objeto JsonPrimitive, que se transformará en entero, flotante, cadena de texto o lo que corresponda.

De este modo, se ha logrado transformar la clase de Java cuyos atributos eran “id” y “palabras”, en un código JSON con tres atributos, el primero “id”, el segundo “label” y el tercero “value”.

Finalmente queda aplicar el serializar al proceso Gson. En este caso utilizaremos la clase GsonBuilder, que proporciona un objeto Gson personalizado, que incluirá nuestro serializador específico para la clase “Palabras”:

GsonBuilder gsonb = new GsonBuilder();
gsonb.registerTypeAdapter(Palabras.class, new PalabrasSerializer());

Gson gson = gsonb.create();
String salida = gson.toJson(palabras);

El resultado será el siguiente

["id":351,"label":"pepe","value":"pepe"]
Anuncios

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