Livre de recettes de sérialisation Gson

Dans cet article, nous allons examiner les scénarios les plus courants de sérialisation à l'aide de la bibliothèque Gson.

Commençons par présenter une entité simple que nous allons utiliser dans les exemples suivants:

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

1. Sérialiser un tableau d'entités

Commençons par sérialiser un tableau d'objets avec 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. Sérialiser une collection d'entités

Ensuite, faisons de même pour une collection d'objets:

@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. Modifier les noms de champ d'une entité lors de la sérialisation

Voyons ensuite comment nous pouvons changer le nom du champ lorsque nous sérialisons une entité.

Nous allons sérialiser notre entité, contenant les champs intValue et stringValue à un json avec otherIntValue et 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); }

Notez que nous utilisons ici un sérialiseur personnalisé pour changer le nom de nos champs:

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. Ignorer un champ lors de la sérialisation d'une entité

Ignorons maintenant complètement un champ lors de la sérialisation:

@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); }

Semblable à l'exemple précédent, nous utilisons également un sérialiseur personnalisé ici:

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; } }

Notez également que nous devons probablement le faire dans les cas où nous ne pouvons pas modifier le code source de l'entité, ou si le champ ne doit être ignoré que dans des cas très spécifiques. Sinon, nous pouvons ignorer le champ plus facilement avec une annotation directe sur la classe d'entité.

5. Sérialiser un champ uniquement s'il satisfait à une condition personnalisée

Enfin, analysons un cas d'utilisation plus avancé - nous ne voulons sérialiser un champ que s'il passe une condition spécifique et personnalisée.

Par exemple, sérialisons uniquement la valeur int si elle est positive et sautons-la simplement si elle est négative:

@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); }

Bien sûr, nous utilisons également un sérialiseur personnalisé ici:

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; } }

Et c'est tout - 5 cas d'utilisation courants de la sérialisation à l'aide de Gson .