Gson Serialization Cookbook

Gson Serialization Cookbook

In diesem Artikel werden die häufigsten Szenarien der Serialisierung mitthe Gson library beschrieben.

Beginnen wir mit der Einführung vona simple entity, die wir in den folgenden Beispielen verwenden werden:

public class SourceClass {
    private int intValue;
    private String stringValue;

    // standard getters and setters
}

1. Serialisieren Sie ein Array von Entitäten

Lassen Sie uns zunächst ein Array von Objekten mit Gson serialisieren:

@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. Serialisieren Sie eine Sammlung von Entitäten

Als Nächstes machen wir dasselbe für eine Sammlung von Objekten:

@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. Ändern Sie die Feldnamen einer Entität bei der Serialisierung

Als nächstes wollen wir sehen, wie wirchange the name of the field können, wenn wir eine Entität serialisieren.

Wir werden unsere Entität serialisieren und die FelderintValue undstringValue zu einem json mitotherIntValue undotherStringValue enthalten:

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

Beachten Sie, dass wir hier einen benutzerdefinierten Serializer verwenden, um den Namen unserer Felder zu ändern:

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. Ignorieren Sie ein Feld, wenn Sie eine Entität serialisieren

Lassen Sie uns jetztignore a field completely ausführen, wenn Sie die Serialisierung durchführen:

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

Ähnlich wie im vorherigen Beispiel verwenden wir auch hier einen benutzerdefinierten Serializer:

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

Beachten Sie auch, dass dies höchstwahrscheinlich in Fällen erforderlich ist, in denen der Quellcode der Entität nicht geändert werden kann oder in denen das Feld nur in ganz bestimmten Fällen ignoriert werden sollte. Andernfalls können wir das Feld mit einer direkten Annotation für die Entitätsklasse leichter ignorieren.

5. Serialisieren Sie ein Feld nur, wenn es eine benutzerdefinierte Bedingung erfüllt

Lassen Sie uns abschließend einen fortgeschritteneren Anwendungsfall analysieren. Wir möchten ein Feld nur dann serialisieren, wenn es eine bestimmte benutzerdefinierte Bedingung erfüllt.

Lassen Sie uns beispielsweise den int-Wert nur serialisieren, wenn er positiv ist, und ihn einfach überspringen, wenn er negativ ist:

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

Natürlich verwenden wir auch hiera 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;
    }
}

Und das war's - 5 häufige Fälle vonserialization using Gson.