Gson Deserialization Cookbook

I denne kogebog undersøger vi de forskellige måder at fjern JSON til Java-objekter, ved hjælp af det populære Gson-bibliotek.

1. Deserialiser JSON til enkelt grundlæggende objekt

Lad os starte simpelt - det skal vi unmarshall en simpel json til et Java-objekt - Foo:

offentlig klasse Foo {public int intValue; offentlig String stringValue; // + standard er lig med og hashCode implementeringer}

Og løsningen:

@Test offentlig ugyldig nårDeserializingToSimpleObject_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "}"; Foo targetObject = ny Gson (). Fra Json (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "one"); }

2. Deserialiser JSON til generisk objekt

Næste - lad os definere et objekt ved hjælp af generiske:

offentlig klasse GenericFoo {offentlig T-værdi; }

Og fjern noget json i denne type objekt:

@Test offentlig ugyldig nårDeserializingToGenericObject_thenCorrect () {Type typeToken = ny TypeToken() {} .getType (); String json = "{" theValue ": 1}"; GenericFoo targetObject = ny Gson (). Fra Json (json, typeToken); assertEquals (targetObject.theValue, nyt heltal (1)); }

3. Deserialiser JSON med ekstra ukendte felter, der skal indvendes

Næste - lad os deserialisere noget komplekst json, der indeholder yderligere, ukendte felter:

@Test offentlig ugyldighed givenJsonHasExtraValues_whenDeserializing_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "," extraString ":" two "," extraFloat ": 2.2}"; Foo targetObject = ny Gson (). Fra Json (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "one"); }

Som du kan se, Gson ignorerer de ukendte felter og bare matche de felter, som den kan.

4. Deserialiser JSON med ikke-matchende feltnavne, der skal indvendes

Lad os nu se, hvordan Gson gør det med en json-streng, der indeholder felter, der simpelthen ikke matcher vores felter Foo objekt:

@Test offentlig ugyldighed givetJsonHasNonMatchingFields_whenDeserializingWithCustomDeserializer_thenCorrect () {String json = "{" valueInt ": 7," valueString ":" seven "}"; GsonBuilder gsonBldr = ny GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, ny FooDeserializerFromJsonWithDifferentFields ()); Foo targetObject = gsonBldr.create (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 7); assertEquals (targetObject.stringValue, "syv"); }

Bemærk, at vi har registreret en brugerdefineret deserializer - dette var i stand til korrekt at analysere felterne fra json-strengen og kortlægge dem til vores Foo:

offentlig klasse FooDeserializerFromJsonWithDifferentFields implementerer JsonDeserializer {@ Override offentlig Foo deserialize (JsonElement jElement, Type typeOfT, JsonDeserializationContext context) kaster JsonParseException {JsonObject jObject = jElementOget.As int intValue = jObject.get ("valueInt"). getAsInt (); String stringValue = jObject.get ("valueString"). GetAsString (); returner ny Foo (intValue, stringValue); }}

5. Deserialiser JSON Array til Java Array of Objects

Dernæst vil vi deserialisere et json-array til et Java-array af Foo genstande:

@Test offentlig ugyldighed givetJsonArrayOfFoos_whenDeserializingToArray_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}," + "{" intValue ": 2," stringValue ":" two "}]"; Foo [] targetArray = ny GsonBuilder (). Opret (). Fra Json (json, Foo []. Klasse); assertThat (Lists.newArrayList (targetArray), hasItem (ny Foo (1, "en"))); assertThat (Lists.newArrayList (targetArray), hasItem (ny Foo (2, "to"))); assertThat (Lists.newArrayList (targetArray), ikke (hasItem (ny Foo (1, "to")))); }

6. Deserialiser JSON Array to Java Collection

Dernæst et json-array direkte i en Java-samling:

@Test offentlig ugyldighed givetJsonArrayOfFoos_whenDeserializingCollection_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; Skriv targetClassType = nyt TypeToken() {} .getType (); Samling targetCollection = ny Gson (). Fra Json (json, targetClassType); assertThat (targetCollection, instanceOf (ArrayList.class)); }

7. Deserialiser JSON til indlejrede objekter

Lad os derefter definere vores indlejrede objekt - FooWithInner:

offentlig klasse FooWithInner {public int intalue; offentlig String stringValue; offentlig InnerFoo innerFoo; offentlig klasse InnerFoo {offentligt strengnavn; }}

Og her er hvordan man deserialiserer et input, der indeholder dette indlejrede objekt:

@Test offentlig ugyldig nårDeserializingToNestedObjects_thenCorrect () {String json = "{\" intValue \ ": 1, \" stringValue \ ": \" one \ ", \" innerFoo \ ": {\" name \ ": \" inner \ "}}" FooWithInner targetObject = ny Gson (). Fra Json (json, FooWithInner.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "one"); assertEquals (targetObject.innerFoo.name, "indre"); }

8. Deserialiser JSON ved hjælp af brugerdefineret konstruktør

Lad os endelig se, hvordan man tvinger brugen af ​​en bestemt konstruktør under deserialiseringer i stedet for standard - ingen argumenter konstruktør - ved hjælp af InstanceCreator:

offentlig klasse FooInstanceCreator implementerer InstanceCreator {@ Override public Foo createInstance (Type type) {returner ny Foo ("prøve"); }}

Og her er hvordan man bruger vores FooInstanceCreator i deserialisering:

@Test offentlig ugyldig nårDeserializingUsingInstanceCreator_thenCorrect () {String json = "{\" intValue \ ": 1}"; GsonBuilder gsonBldr = ny GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, ny FooInstanceCreator ()); Foo targetObject = gsonBldr.create (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "prøve"); }

Bemærk, at i stedet for null, Foo.stringValue lige med prøve da vi brugte følgende konstruktør:

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

9. Konklusion

Denne artikel viser, hvordan man udnytter Gson-biblioteket til parse JSON input - gennemgår de mest almindelige usecases for både enkelt og flere objekter.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit github-projekt - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.