Gson Deserialization Cookbook

In dit kookboek verkennen we de verschillende manieren om unmarshall JSON in Java-objecten, met behulp van de populaire Gson-bibliotheek.

1. Deserialiseer JSON naar één basisobject

Laten we eenvoudig beginnen - we gaan het doen unmarshall een eenvoudige json naar een Java-object - Foo:

openbare klasse Foo {openbare int intValue; openbare String stringValue; // + standaard is gelijk aan en hashCode-implementaties}

En de oplossing:

@Test openbare leegte whenDeserializingToSimpleObject_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "}"; Foo targetObject = nieuwe Gson (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "één"); }

2. Deserialiseer JSON naar algemeen object

Vervolgens - laten we een object definiëren met behulp van generieke gegevens:

openbare klasse GenericFoo {openbare T theValue; }

En unmarshall wat json in dit type object:

@Test public void whenDeserializingToGenericObject_thenCorrect () {Type typeToken = nieuw TypeToken() {} .getType (); String json = "{" theValue ": 1}"; GenericFoo targetObject = nieuwe Gson (). FromJson (json, typeToken); assertEquals (targetObject.theValue, new Integer (1)); }

3. Deserialiseer JSON met extra onbekende velden voor objecten

Vervolgens - laten we een aantal complexe json deserialiseren die extra bevat, onbekende velden:

@Test openbare ongeldig gegevenJsonHasExtraValues_whenDeserializing_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "," extraString ":" twee "," extraFloat ": 2.2}"; Foo targetObject = nieuwe Gson (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "één"); }

Zoals je kunt zien, Gson negeert de onbekende velden en vergelijk eenvoudig de velden die het kan.

4. Deserialiseer JSON met niet-overeenkomende veldnamen naar Object

Laten we nu eens kijken hoe Gson het doet met een json-string die velden bevat die simpelweg niet overeenkomen met de velden van onze Foo voorwerp:

@Test openbare ongeldig gegevenJsonHasNonMatchingFields_whenDeserializingWithCustomDeserializer_thenCorrect () {String json = "{" valueInt ": 7," valueString ":" seven "}"; GsonBuilder gsonBldr = nieuwe GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, nieuwe FooDeserializerFromJsonWithDifferentFields ()); Foo targetObject = gsonBldr.create (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 7); assertEquals (targetObject.stringValue, "zeven"); }

Merk op dat we ons hebben geregistreerd een aangepaste deserializer - dit was in staat om de velden van de json-string correct te ontleden en ze toe te wijzen aan onze Foo:

openbare klasse FooDeserializerFromJsonWithDifferentFields implementeert JsonDeserializer {@Override public Foo deserialize (JsonElement jElement, Type typeOfT, JsonDeserializationContext context) gooit JsonParseException {JsonObject jObject = jElement.getAsJson = jElement.getAsJson; int intValue = jObject.get ("valueInt"). getAsInt (); String stringValue = jObject.get ("valueString"). GetAsString (); retourneer nieuwe Foo (intValue, stringValue); }}

5. Deserialiseer JSON Array naar Java Array of Objects

Vervolgens gaan we deserialiseren een json-array in een Java-array van Foo voorwerpen:

@Test openbare ongeldig gegevenJsonArrayOfFoos_whenDeserializingToArray_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}," + "{" intValue ": 2," stringValue ":" twee "}]"; Foo [] targetArray = nieuwe 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), niet (hasItem (new Foo (1, "two")))); }

6. Deserialiseer JSON-array naar Java-verzameling

Vervolgens een json-array rechtstreeks in een Java-collectie:

@Test openbare ongeldig gegevenJsonArrayOfFoos_whenDeserializingCollection_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" twee "}]"; Typ targetClassType = nieuw TypeToken() {} .getType (); Verzameling targetCollection = nieuwe Gson (). FromJson (json, targetClassType); assertThat (targetCollection, instanceOf (ArrayList.class)); }

7. Deserialiseer JSON naar geneste objecten

Laten we vervolgens ons geneste object definiëren - FooWithInner:

openbare klasse FooWithInner {openbare int intValue; openbare String stringValue; openbare InnerFoo innerFoo; openbare klasse InnerFoo {openbare tekenreeksnaam; }}

En hier is hoe u een invoer met dit geneste object deserialiseert:

@Test public void whenDeserializingToNestedObjects_thenCorrect () {String json = "{\" intValue \ ": 1, \" stringValue \ ": \" one \ ", \" innerFoo \ ": {\" naam \ ": \" inner \ "}}"; FooWithInner targetObject = nieuwe Gson (). FromJson (json, FooWithInner.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "één"); assertEquals (targetObject.innerFoo.name, "inner"); }

8. Deserialiseer JSON met Custom Constructor

Laten we tot slot kijken hoe we het gebruik van een specifieke constructor kunnen forceren tijdens deserialisaties in plaats van standaard - geen argumenten constructor - met InstanceCreator:

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

En hier is hoe u onze kunt gebruiken FooInstanceCreator bij deserialisatie:

@Test openbare leegte whenDeserializingUsingInstanceCreator_thenCorrect () {String json = "{\" intValue \ ": 1}"; GsonBuilder gsonBldr = nieuwe GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, nieuwe FooInstanceCreator ()); Foo targetObject = gsonBldr.create (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "sample"); }

Merk op dat in plaats van null de Foo.stringValue is gelijk aan monster zoals we de volgende constructor gebruikten:

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

9. Conclusie

Dit artikel laat zien hoe u de Gson-bibliotheek kunt gebruiken voor ontleden JSON-invoer - het doornemen van de meest voorkomende gebruiksgevallen voor zowel enkele als meervoudige objecten.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in mijn github-project - dit is een op Eclipse gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.