Gson Deserialization Cookbook

U ovoj kuharici istražujemo razne načine kako unmarshall JSON u Java objekte, koristeći popularnu Gson knjižnicu.

1. Deserijalizirajte JSON na jedan osnovni objekt

Krenimo jednostavno - idemo demontirati jednostavni json na Java objekt - Foo:

javna klasa Foo {public int intValue; javni String stringValue; // + standardne jednake i implementacije hashCode}

I rješenje:

@Test public void whenDeserializingToSimpleObject_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "}"; Foo targetObject = novi Gson (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "jedan"); }

2. Deserijalizirajte JSON na generički objekt

Dalje - definirajmo objekt pomoću generičkih podataka:

javna klasa GenericFoo {public T theValue; }

I demarširajte neki json u ovu vrstu objekta:

@Test public void whenDeserializingToGenericObject_thenCorrect () {Type typeToken = novi TypeToken() {} .getType (); Niz json = "{" theValue ": 1}"; GenericFoo targetObject = novi Gson (). FromJson (json, typeToken); assertEquals (targetObject.theValue, novi cijeli broj (1)); }

3. Deserijalizirajte JSON s dodatnim nepoznatim poljima kojima ćete prigovoriti

Dalje - hajde deserializirajte neki složeni json koji sadrži dodatne, nepoznata polja:

@Test javna praznina givenJsonHasExtraValues_whenDeserializing_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "," extraString ":" two "," extraFloat ": 2.2}"; Foo targetObject = novi Gson (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "jedan"); }

Kao što vidiš, Gson će ignorirati nepoznata polja i jednostavno podudarati polja koja je u mogućnosti.

4. Deserijalizirajte JSON s nepodudarajućim imenima polja za objekt

Sada, da vidimo kako Gson radi s json nizom koji sadrži polja koja se jednostavno ne podudaraju s poljima našeg Foo objekt:

@Test javna praznina givenJsonHasNonMatchingFields_whenDeserializingWithCustomDeserializer_thenCorrect () {String json = "{" valueInt ": 7," valueString ":" seven "}"; GsonBuilder gsonBldr = novi GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, novi FooDeserializerFromJsonWithDifferentFields ()); Foo targetObject = gsonBldr.create (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 7); assertEquals (targetObject.stringValue, "sedam"); }

Primijetite da smo se registrirali prilagođeni deserializator - ovo je uspjelo pravilno raščlaniti polja iz json niza i mapirati ih na naša Foo:

javna klasa FooDeserializerFromJsonWithDifferentFields implementira JsonDeserializer {@Override javni Foo deserializira (JsonElement jElement, Type typeOfT, JsonDeserializationContext context) baca JsonParseException {JsonObject jObject = jEbject = jEbject = jEbject = jEbJent = jEbJent = jEbJent = jEbJent = jEbJent = jEbment = jEbJent = jEbJent = jEbl int intValue = jObject.get ("valueInt"). getAsInt (); Niz stringValue = jObject.get ("valueString"). GetAsString (); vrati novi Foo (intValue, stringValue); }}

5. Deserijalizirajte JSON niz na Java niz objekata

Dalje ćemo deserializirati json niz u Java niz od Foo objekti:

@Test public void givenJsonArrayOfFoos_whenDeserializingToArray_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}," + "{" intValue ": 2," stringValue ":" two "}]"; Foo [] targetArray = novi GsonBuilder (). Create (). FromJson (json, Foo []. Klasa); assertThat (Lists.newArrayList (targetArray), hasItem (novi Foo (1, "jedan"))); assertThat (Lists.newArrayList (targetArray), hasItem (novi Foo (2, "dva"))); assertThat (Lists.newArrayList (targetArray), ne (hasItem (novi Foo (1, "dva")))); }

6. Deserijalizirajte JSON niz u Java kolekciju

Dalje, json niz izravno u Zbirku Java:

@Test javna praznina givenJsonArrayOfFoos_whenDeserializingCollection_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; Upišite targetClassType = novi TypeToken() {} .getType (); Zbirka targetCollection = novi Gson (). FromJson (json, targetClassType); assertThat (targetCollection, instanceOf (ArrayList.class)); }

7. Deserijalizirajte JSON na ugniježđene objekte

Dalje, definirajmo svoj ugniježđeni objekt - FooWithInner:

javna klasa FooWithInner {public int intValue; javni String stringValue; javni InnerFoo innerFoo; javna klasa InnerFoo {naziv javnog niza; }}

Evo i kako deserializirati ulaz koji sadrži ovaj ugniježđeni objekt:

@Test public void whenDeserializingToNestedObjects_thenCorrect () {String json = "{\" intValue \ ": 1, \" stringValue \ ": \" one \ ", \" innerFoo \ ": {\" name \ ": \" internal \ "}}"; FooWithInner targetObject = novi Gson (). FromJson (json, FooWithInner.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "jedan"); assertEquals (targetObject.innerFoo.name, "unutarnji"); }

8. Deserijalizirajte JSON pomoću prilagođenog konstruktora

Konačno, pogledajmo kako forsirati upotrebu određenog konstruktora tijekom deserializacije umjesto zadane - bez konstruktora argumenata - koristeći InstanceCreator:

javna klasa FooInstanceCreator implementira InstanceCreator {@Override public Foo createInstance (tip tipa) {return new Foo ("sample"); }}

A ovdje je kako koristiti naš FooInstanceCreator u deserializaciji:

@Test public void whenDeserializingUsingInstanceCreator_thenCorrect () {String json = "{\" intValue \ ": 1}"; GsonBuilder gsonBldr = novi GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, novi FooInstanceCreator ()); Foo targetObject = gsonBldr.create (). FromJson (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "uzorak"); }

Imajte na umu da umjesto nule, Foo.stringValue jednako uzorak kao što smo koristili sljedeći konstruktor:

javni Foo (niz stringValue) {this.stringValue = stringValue; }

9. Zaključak

Ovaj članak pokazuje kako iskoristiti Gson knjižnicu raščlaniti JSON ulaz - pregledavanje najčešćih slučajeva korištenja i za pojedinačne i za više objekata.

Implementacija svih ovih primjera i isječaka koda mogu se naći u mom github projektu - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.