Livre de recettes de sérialisation Gson

Livre de recettes sur la sérialisation Gson

Dans cet article, nous allons examiner les scénarios les plus courants de sérialisation utilisantthe Gson library.

Commençons par présentera simple entity 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 pouvonschange the name of the field lorsque nous sérialisons une entité.

Nous allons sérialiser notre entité, contenant les champsintValue etstringValue vers un json avecotherIntValue etotherStringValue:

@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 modifier 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é

Passons maintenant àignore a field completely 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);
}

Comme dans 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 satisfait à une condition personnalisée spécifique.

Par exemple, sérialisons la valeur int uniquement si elle est positive et ignorons-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 ici aussia custom serializer:

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 deserialization using Gson.