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.