In this article weβre going to look at the most common scenarios of serialization using the Gson library.
Letβs start by introducing a simple entity that weβre going to use throughout the following examples:
public class SourceClass {
private int intValue;
private String stringValue;
// standard getters and setters
}
1. Serialize an Array of Entities
First, letβs serialize an array of objects with 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. Serialize a Collection of Entities
Next, letβs do the same for a Collection of objects:
@Test
public void givenCollection_whenSerializing_thenCorrect() {
Collection<SourceClass> 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. Change the Field Names of an Entity on Serialization
Next, letβs see how we can change the name of the field when weβre serializing an entity.
Weβre going to serialize our entity, containing the fields intValue and stringValue to a json with otherIntValue and 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);
}
Note that weβre using a custom serializer here to change the name of our fields:
public class DifferentNameSerializer implements JsonSerializer<SourceClass> {
@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 a Field When Serializing an Entity
Letβs now ignore a field completely when performing the serialization:
@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);
}
Similar to the previous example, weβre using a custom serializer here as well:
public class IgnoringFieldsSerializer implements JsonSerializer<SourceClass> {
@Override
public JsonElement serialize
(SourceClass src, Type typeOfSrc, JsonSerializationContext context) {
String intValue = "intValue";
JsonObject jObject = new JsonObject();
jObject.addProperty(intValue, src.getIntValue());
return jObject;
}
}
Also note that we most likely need to do this in cases where we cannot change the source code of the entity, or if the field should only be ignored very specific cases. Otherwise we can ignore the field easier with a direct annotation on the entity class.
5. Serialize a Field Only If It Passes a Custom Condition
Finally, letβs analyze a more advanced usecase β we want to only serialize a field if it passes a specific, custom condition.
For example, letβs only serialize the int value if itβs positive and simply skip it if itβs negative:
@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<SourceClass>() {}.getType();
String jsonString = gson.toJson(sourceObject, sourceObjectType);
String expectedResult = "{"stringValue":"minus 1"}";
assertEquals(expectedResult, jsonString);
}
Of course weβre using a custom serializer here as well:
public class IgnoringFieldsNotMatchingCriteriaSerializer
implements JsonSerializer<SourceClass> {
@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;
}
}
And thatβs it β 5 common usecases of serialization using Gson.
