Gson Deserialization Cookbook

I denne kokeboken utforsker vi de forskjellige måtene å unmarshall JSON til Java-objekter, ved hjelp av det populære Gson-biblioteket.

1. Deseriser JSON til enkelt grunnleggende objekt

La oss starte enkelt - vi skal unmarshall en enkel json til et Java-objekt - Foo:

offentlig klasse Foo {public int intValue; offentlig streng strengverdi; // + standard er lik og hashCode-implementeringer}

Og løsningen:

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

2. Deseriser JSON til generisk objekt

Neste - la oss definere et objekt ved hjelp av generiske:

public class GenericFoo {public T theValue; }

Og unmarshall noen json i denne typen 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, new Integer (1)); }

3. Deseriser JSON med ekstra ukjente felt å motsette

Neste - la oss deserialisere noen komplekse json som inneholder ekstra, ukjente felt:

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

Som du kan se, Gson vil ignorere de ukjente feltene og bare matche feltene som den kan.

4. Deseriser JSON med feltnavn som ikke samsvarer med objektet

La oss nå se hvordan Gson gjør det med en json-streng som inneholder felt som ganske enkelt ikke samsvarer med feltene i vår Foo gjenstand:

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

Legg merke til at vi registrerte oss en tilpasset deserializer - dette var i stand til å analysere feltene fra json-strengen riktig og kartlegge dem til vår 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. Deseriser JSON Array til Java Array of Objects

Deretter skal vi deserialisere en json-matrise til en Java-matrise av Foo gjenstander:

@Test offentlig ugyldig gittJsonArrayOfFoos_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. Deserialiser JSON Array to Java Collection

Deretter et json-utvalg direkte inn i en Java-samling:

@Test offentlig ugyldig gittJsonArrayOfFoos_whenDeserializingCollection_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; Skriv inn targetClassType = ny TypeToken() {} .getType (); Samling targetCollection = ny Gson (). FraJson (json, targetClassType); assertThat (targetCollection, instanceOf (ArrayList.class)); }

7. Deseriser JSON til nestede objekter

La oss deretter definere vårt nestede objekt - FooWithInner:

offentlig klasse FooWithInner {public int intalue; offentlig streng strengverdi; offentlig InnerFoo innerFoo; offentlig klasse InnerFoo {offentlig strengnavn; }}

Og her er hvordan du deserialiserer en inngang som inneholder dette nestede objektet:

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

8. Deseriser JSON ved hjelp av tilpasset konstruktør

Til slutt, la oss se hvordan man kan tvinge bruk av en bestemt konstruktør under deserialiseringer i stedet for standard - ingen argumenter konstruktør - ved hjelp av InstanceCreator:

offentlig klasse FooInstanceCreator implementerer InstanceCreator {@Override public Foo createInstance (Type type) {return new Foo ("sample"); }}

Og her er hvordan du bruker vår FooInstanceCreator i deserialisering:

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

Merk at i stedet for null Foo.stringValue er lik prøve da vi brukte følgende konstruktør:

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

9. Konklusjon

Denne artikkelen viser hvordan du kan utnytte Gson-biblioteket til analyser JSON-inngang - å gå over de vanligste bruksområdene for både enkelt- og flere objekter.

Implementeringen av alle disse eksemplene og kodebiter finner du i github-prosjektet mitt - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found