Gson Deserialization Cookbook

Ebben a szakácskönyvben a különböző módokat vizsgáljuk unmarshall JSON Java objektumokká, a népszerű Gson könyvtár használatával.

1. Deserializálja a JSON-t egyetlen alapobjektummá

Kezdjük egyszerűen - fogunk unmarshall egy egyszerű json egy Java objektumhoz - Foo:

Foo {public int intValue nyilvános osztály; public String stringValue; // + standard egyenlő és hashCode implementációk}

És a megoldás:

@Test public void whenDeserializingToSimpleObject_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "}"; Foo targetObject = new Gson (). From Json (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "egy"); }

2. Deserializálja a JSON-t általános objektummá

Következő - definiáljunk egy objektumot generikus módszerekkel:

public class GenericFoo {public T theValue; }

És vonjon le néhány jsont az ilyen típusú objektumokról:

@Test public void whenDeserializingToGenericObject_thenCorrect () {Type typeToken = new TypeToken() {} .getType (); Karakterlánc json = "{" theValue ": 1}"; GenericFoo targetObject = new Gson (). From Json (json, typeToken); assertEquals (targetObject.theValue, új egész szám (1)); }

3. Deserializálja a JSON-t extra ismeretlen mezőkkel az objektumhoz

Következő - deserializáljunk néhány komplex json-t, amely további, ismeretlen mezők:

@Test public void givenJsonHasExtraValues_whenDeserializing_thenCorrect () {String json = "{" intValue ": 1," stringValue ":" one "," extraString ":" two "," extraFloat ": 2.2}"; Foo targetObject = new Gson (). From Json (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "egy"); }

Amint látod, Gson figyelmen kívül hagyja az ismeretlen mezőket és egyszerűen illessze össze azokat a mezőket, amelyekre képes.

4. Deserializálja a JSON-t az objektum nem egyező mezőneveivel

Most nézzük meg, hogy áll a Gson egy json karakterlánccal, amely olyan mezőket tartalmaz, amelyek egyszerűen nem egyeznek a mezőinkkel Foo tárgy:

@Test public void givenJsonHasNonMatchingFields_whenDeserializingWithCustomDeserializer_thenCorrect () {String json = "{" valueInt ": 7," valueString ":" seven "}"; GsonBuilder gsonBldr = new GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, új FooDeserializerFromJsonWithDifferFields ()); Foo targetObject = gsonBldr.create (). From Json (json, Foo.class); assertEquals (targetObject.intValue, 7); assertEquals (targetObject.stringValue, "hét"); }

Figyeljük meg, hogy regisztráltunk egyedi deserializer - ez képes volt megfelelően elemezni a mezőket a json karakterláncból, és feltérképezni őket a miénkre Foo:

public class FooDeserializerFromJsonWithDifferentFields implementates JsonDeserializer {@Orride public Foo deserialize (JsonElement jElement, Type typeOfT, JsonDeserializationContext context) dobja JsonParseException {JsonObject jObject = jElement.get; int intValue = jObject.get ("valueInt"). getAsInt (); String stringValue = jObject.get ("valueString"). GetAsString (); return new Foo (intValue, stringValue); }}

5. Deserializálja a JSON tömböt az objektumok Java tömbjéhez

Ezután deszerializálódunk egy json tömböt Java tömbbe nak,-nek Foo tárgyak:

@Test public void givenJsonArrayOfFoos_whenDeserializingToArray_thenCorrect () {String json = "[{" intValue ": 1," stringValue ":" one "}," + "{" intValue ": 2," stringValue ":" two "}]"; Foo [] targetArray = new GsonBuilder (). Create (). FromJson (json, Foo []. Osztály); assertThat (Lists.newArrayList (targetArray), hasItem (új Foo (1, "egy"))); assertThat (Lists.newArrayList (targetArray), hasItem (új Foo (2, "kettő"))); assertThat (Lists.newArrayList (targetArray), nem (hasItem (új Foo (1, "kettő")))); }

6. A JSON tömb deserializálása a Java gyűjteménybe

Ezután egy json tömb közvetlenül egy Java Gyűjteménybe:

@Test public void givenJsonArrayOfFoos_whenDeserializingCollection_thenCorrect () {String json = "[{" "intValue": 1, "stringValue": "one"}, {"intValue": 2, "stringValue": "kettő"}] "; Type targetClassType = new TypeToken() {} .getType (); Gyűjtemény targetCollection = új Gson (). From Json (json, targetClassType); assertThat (targetCollection, instanceOf (ArrayList.class)); }

7. Deserializálja a JSON-ot beágyazott objektumokká

Ezután definiáljuk beágyazott objektumunkat - FooWithInner:

FooWithInner {public int intValue nyilvános osztály; public String stringValue; public InnerFoo innerFoo; public class InnerFoo {public String name; }}

A következőképpen lehet deserializálni ezt a beágyazott objektumot tartalmazó bemenetet:

@Test public void whenDeserializingToNestedObjects_thenCorrect () {String json = "{\" intValue \ ": 1, \" stringValue \ ": \" one \ ", \" internalFoo \ ": {\" name \ ": \" internal \ " "}}"; FooWithInner targetObject = new Gson (). From Json (json, FooWithInner.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "egy"); assertEquals (targetObject.innerFoo.name, "belső"); }

8. Deserializálja a JSON-ot az Custom Constructor használatával

Végül nézzük meg, hogyan erőltethetünk egy adott konstruktort deserializációk során az alapértelmezett - nincs argumentum konstruktor - helyett Példányalkotó:

a FooInstanceCreator nyilvános osztály implementálja az instanceCreator {@Orride public Foo createInstance (Type type) {return new Foo ("sample"); }}

És itt van, hogyan kell használni a mi FooInstanceCreator deserializációban:

@Test public void whenDeserializingUsingInstanceCreator_thenCorrect () {String json = "{\" intValue \ ": 1}"; GsonBuilder gsonBldr = new GsonBuilder (); gsonBldr.registerTypeAdapter (Foo.class, új FooInstanceCreator ()); Foo targetObject = gsonBldr.create (). From Json (json, Foo.class); assertEquals (targetObject.intValue, 1); assertEquals (targetObject.stringValue, "minta"); }

Ne feledje, hogy null helyett a Foo.stringValue egyenlő minta mivel a következő konstruktort használtuk:

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

9. Következtetés

Ez a cikk bemutatja, hogyan lehet kihasználni a Gson könyvtárat elemzi a JSON bemenetet - mind az egyetlen, mind a több objektum leggyakoribb felhasználási módjainak áttekintése.

Mindezen példák és kódrészletek megvalósítása megtalálható a github projektemben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.


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