Gson Deserialization Cookbook

Gson Deserialization Cookbook

In diesem Kochbuch untersuchen wir die verschiedenen Möglichkeiten fürunmarshall JSON into Java objects unter Verwendung der beliebtenGson library.

1. Deserialisieren Sie JSON in ein einzelnes Basisobjekt

Fangen wir einfach an - wir gehen zuunmarshall a simple json to a Java object – Foo:

public class Foo {
    public int intValue;
    public String stringValue;

    // + standard equals and hashCode implementations
}

Und die Lösung:

@Test
public void whenDeserializingToSimpleObject_thenCorrect() {
    String json = "{"intValue":1,"stringValue":"one"}";

    Foo targetObject = new Gson().fromJson(json, Foo.class);

    assertEquals(targetObject.intValue, 1);
    assertEquals(targetObject.stringValue, "one");
}

Weitere Lektüre:

Felder von der Serialisierung in Gson ausschließen

Informieren Sie sich über die verfügbaren Optionen zum Ausschließen von Feldern von der Serialisierung in Gson.

Read more

Gson Serialization Cookbook

Erfahren Sie, wie Sie Entitäten mithilfe der Gson-Bibliothek serialisieren.

Read more

Jackson gegen Gson

Schnelle und praktische Anleitung zur Serialisierung mit Jackson und Gson.

Read more

2. Deserialisieren Sie JSON in ein generisches Objekt

Weiter - Definieren wir ein Objekt mithilfe von Generika:

public class GenericFoo {
    public T theValue;
}

Und einige Json in diese Art von Objekt unmarshall:

@Test
public void whenDeserializingToGenericObject_thenCorrect() {
    Type typeToken = new TypeToken>() { }.getType();
    String json = "{"theValue":1}";

    GenericFoo targetObject = new Gson().fromJson(json, typeToken);

    assertEquals(targetObject.theValue, new Integer(1));
}

3. Deserialisieren Sie JSON mit zusätzlichen unbekannten Feldern für das Objekt

Weiter - Lassen Sie uns einige komplexe JSON deserialisieren, die zusätzlicheunknown fields enthalten:

@Test
public void givenJsonHasExtraValues_whenDeserializing_thenCorrect() {
    String json =
      "{"intValue":1,"stringValue":"one","extraString":"two","extraFloat":2.2}";
    Foo targetObject = new Gson().fromJson(json, Foo.class);

    assertEquals(targetObject.intValue, 1);
    assertEquals(targetObject.stringValue, "one");
}

Wie Sie sehen können, geben SieGson will ignore the unknown fieldsan und stimmen Sie einfach mit den Feldern überein, die es können.

4. Deserialisieren Sie JSON mit nicht übereinstimmenden Feldnamen für das Objekt

Lassen Sie uns nun sehen, wie Gson mit einer JSON-Zeichenfolge umgeht, die Felder enthält, die einfach nicht mit den Feldern unseresFoo-Objekts übereinstimmen:

@Test
public void givenJsonHasNonMatchingFields_whenDeserializingWithCustomDeserializer_thenCorrect() {
    String json = "{"valueInt":7,"valueString":"seven"}";

    GsonBuilder gsonBldr = new GsonBuilder();
    gsonBldr.registerTypeAdapter(Foo.class, new FooDeserializerFromJsonWithDifferentFields());
    Foo targetObject = gsonBldr.create().fromJson(json, Foo.class);

    assertEquals(targetObject.intValue, 7);
    assertEquals(targetObject.stringValue, "seven");
}

Beachten Sie, dass wira custom deserializer registriert haben. Dadurch konnten die Felder aus der JSON-Zeichenfolge korrekt analysiert und unserenFoo zugeordnet werden:

public class FooDeserializerFromJsonWithDifferentFields implements JsonDeserializer {

    @Override
    public Foo deserialize
      (JsonElement jElement, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {
        JsonObject jObject = jElement.getAsJsonObject();
        int intValue = jObject.get("valueInt").getAsInt();
        String stringValue = jObject.get("valueString").getAsString();
        return new Foo(intValue, stringValue);
    }
}

5. Deserialisieren Sie das JSON-Array in ein Java-Array von Objekten

Als Nächstes deserialisieren wira json array into a Java array vonFoo Objekten:

@Test
public void givenJsonArrayOfFoos_whenDeserializingToArray_thenCorrect() {
    String json = "[{"intValue":1,"stringValue":"one"}," +
      "{"intValue":2,"stringValue":"two"}]";
    Foo[] targetArray = new GsonBuilder().create().fromJson(json, Foo[].class);

    assertThat(Lists.newArrayList(targetArray), hasItem(new Foo(1, "one")));
    assertThat(Lists.newArrayList(targetArray), hasItem(new Foo(2, "two")));
    assertThat(Lists.newArrayList(targetArray), not(hasItem(new Foo(1, "two"))));
}

6. Deserialisieren Sie das JSON-Array in die Java-Sammlung

Als nächstes ein JSON-Arraydirectly into a Java Collection:

@Test
public void givenJsonArrayOfFoos_whenDeserializingCollection_thenCorrect() {
    String json =
      "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]";
    Type targetClassType = new TypeToken>() { }.getType();

    Collection targetCollection = new Gson().fromJson(json, targetClassType);
    assertThat(targetCollection, instanceOf(ArrayList.class));
}

7. Deserialisieren Sie JSON in verschachtelte Objekte

Als nächstes definieren wir unser verschachteltes Objekt -FooWithInner:

public class FooWithInner {
    public int intValue;
    public String stringValue;
    public InnerFoo innerFoo;

    public class InnerFoo {
        public String name;
    }
}

Und so deserialisieren Sie eine Eingabe, die dieses verschachtelte Objekt enthält:

@Test
public void whenDeserializingToNestedObjects_thenCorrect() {
    String json = "{\"intValue\":1,\"stringValue\":\"one\",\"innerFoo\":{\"name\":\"inner\"}}";

    FooWithInner targetObject = new Gson().fromJson(json, FooWithInner.class);

    assertEquals(targetObject.intValue, 1);
    assertEquals(targetObject.stringValue, "one");
    assertEquals(targetObject.innerFoo.name, "inner");
}

8. Deserialisieren Sie JSON mit dem benutzerdefinierten Konstruktor

Lassen Sie uns abschließend sehen, wie Sie die Verwendung eines bestimmten Konstruktors während der Deserialisierung anstelle von Standard - Konstruktor ohne Argumente - mitInstanceCreator erzwingen:

public class FooInstanceCreator implements InstanceCreator {

    @Override
    public Foo createInstance(Type type) {
        return new Foo("sample");
    }
}

Und so verwenden Sie unsereFooInstanceCreator bei der Deserialisierung:

@Test
public void whenDeserializingUsingInstanceCreator_thenCorrect() {
    String json = "{\"intValue\":1}";

    GsonBuilder gsonBldr = new GsonBuilder();
    gsonBldr.registerTypeAdapter(Foo.class, new FooInstanceCreator());
    Foo targetObject = gsonBldr.create().fromJson(json, Foo.class);

    assertEquals(targetObject.intValue, 1);
    assertEquals(targetObject.stringValue, "sample");
}

Beachten Sie, dassFoo.stringValue anstelle von null gleichsample ist, da wir den folgenden Konstruktor verwendet haben:

public Foo(String stringValue) {
    this.stringValue = stringValue;
}

9. Fazit

In diesem Artikel wird gezeigt, wie Sie die Gson-Bibliothek aufparse JSON input nutzen können. Dabei werden die häufigsten Anwendungsfälle für einzelne und mehrere Objekte behandelt.

Die Implementierung all dieser Beispiele und Codefragmentecan be found in my github project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.