Libro de cocina de serialización Gson

En este artículo, veremos los escenarios más comunes de serialización utilizando la biblioteca Gson.

Comencemos presentando una entidad simple que usaremos en los siguientes ejemplos:

public class SourceClass { private int intValue; private String stringValue; // standard getters and setters }

1. Serializar una matriz de entidades

Primero, serialicemos una matriz de objetos con Gson:

@Test public void givenArrayOfObjects_whenSerializing_thenCorrect() { SourceClass[] sourceArray = {new SourceClass(1, "one"), new SourceClass(2, "two")}; String jsonString = new Gson().toJson(sourceArray); String expectedResult = "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]"; assertEquals(expectedResult, jsonString); }

2. Serializar una colección de entidades

A continuación, hagamos lo mismo con una colección de objetos:

@Test public void givenCollection_whenSerializing_thenCorrect() { Collection sourceCollection = Lists.newArrayList(new SourceClass(1, "one"), new SourceClass(2, "two")); String jsonCollection = new Gson().toJson(sourceCollection); String expectedResult = "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]"; assertEquals(expectedResult, jsonCollection); }

3. Cambiar los nombres de campo de una entidad en la serialización

A continuación, veamos cómo podemos cambiar el nombre del campo cuando estamos serializando una entidad.

Vamos a serializar nuestra entidad, que contiene los campos intValue y stringValue a un json con otherIntValue y otherStringValue :

@Test public void givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect() { SourceClass sourceObject = new SourceClass(7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new DifferentNameSerializer()); String jsonString = gsonBuildr.create().toJson(sourceObject); String expectedResult = "{"otherIntValue":7,"otherStringValue":"seven"}"; assertEquals(expectedResult, jsonString); }

Tenga en cuenta que estamos usando un serializador personalizado aquí para cambiar el nombre de nuestros campos:

public class DifferentNameSerializer implements JsonSerializer { @Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) { String otherIntValueName = "otherIntValue"; String otherStringValueName = "otherStringValue"; JsonObject jObject = new JsonObject(); jObject.addProperty(otherIntValueName, src.getIntValue()); jObject.addProperty(otherStringValueName, src.getStringValue()); return jObject; } }

4. Ignore un campo al serializar una entidad

Ahora ignoremos un campo por completo al realizar la serialización:

@Test public void givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored() { SourceClass sourceObject = new SourceClass(7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new IgnoringFieldsSerializer()); String jsonString = gsonBuildr.create().toJson(sourceObject); String expectedResult = "{"intValue":7}"; assertEquals(expectedResult, jsonString); }

Al igual que en el ejemplo anterior, aquí también usamos un serializador personalizado:

public class IgnoringFieldsSerializer implements JsonSerializer { @Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) { String intValue = "intValue"; JsonObject jObject = new JsonObject(); jObject.addProperty(intValue, src.getIntValue()); return jObject; } }

También tenga en cuenta que lo más probable es que necesitemos hacer esto en los casos en que no podamos cambiar el código fuente de la entidad, o si el campo solo debe ignorarse en casos muy específicos. De lo contrario, podemos ignorar el campo más fácilmente con una anotación directa en la clase de entidad.

5. Serializar un campo solo si pasa una condición personalizada

Finalmente, analicemos un caso de uso más avanzado: solo queremos serializar un campo si pasa una condición personalizada específica.

Por ejemplo, solo serialicemos el valor int si es positivo y simplemente omítalo si es negativo:

@Test public void givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored() { SourceClass sourceObject = new SourceClass(-1, "minus 1"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new IgnoringFieldsNotMatchingCriteriaSerializer()); Gson gson = gsonBuildr.create(); Type sourceObjectType = new TypeToken() {}.getType(); String jsonString = gson.toJson(sourceObject, sourceObjectType); String expectedResult = "{"stringValue":"minus 1"}"; assertEquals(expectedResult, jsonString); }

Por supuesto, aquí también estamos usando un serializador personalizado :

public class IgnoringFieldsNotMatchingCriteriaSerializer implements JsonSerializer { @Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) { JsonObject jObject = new JsonObject(); // Criteria: intValue >= 0 if (src.getIntValue() >= 0) { String intValue = "intValue"; jObject.addProperty(intValue, src.getIntValue()); } String stringValue = "stringValue"; jObject.addProperty(stringValue, src.getStringValue()); return jObject; } }

Y eso es todo: 5 casos de uso comunes de serialización con Gson .