Buku Masakan Deserialization Gson

Dalam buku masakan ini, kami meneroka pelbagai cara untuk membongkar JSON ke objek Java , menggunakan perpustakaan Gson yang popular.

1. Deserialize JSON ke Objek Asas Tunggal

Mari mulakan sederhana - kita akan mengeluarkan json mudah ke objek Java - Foo :

public class Foo { public int intValue; public String stringValue; // + standard equals and hashCode implementations }

Dan penyelesaiannya:

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

2. Deserialize JSON ke Objek Generik

Seterusnya - mari tentukan objek menggunakan generik:

public class GenericFoo { public T theValue; }

Dan hapus beberapa json ke objek jenis ini:

@Test public void whenDeserializingToGenericObject_thenCorrect() { Type typeToken = new TypeToken
    
     () { }.getType(); String json = "{"theValue":1}"; GenericFoo targetObject = new Gson().fromJson(json, typeToken); assertEquals(targetObject.theValue, new Integer(1)); }
    

3. Deserialize JSON Dengan Medan yang Tidak Dikenal Lebih Lanjut ke Objek

Seterusnya - mari kita deserialisasi beberapa json kompleks yang mengandungi medan tambahan yang tidak diketahui :

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

Seperti yang anda lihat, Gson akan mengabaikan medan yang tidak diketahui dan hanya memadankan medan yang mampu.

4. Nyatakan JSON dengan Nama Medan Tidak Sesuai dengan Objek

Sekarang, mari kita lihat bagaimana Gson lakukan dengan rentetan json yang mengandungi medan yang tidak sesuai dengan bidang objek Foo kami :

@Test public void givenJsonHasNonMatchingFields_whenDeserializingWithCustomDeserializer_thenCorrect() { String json = "{"valueInt":7,"valueString":"seven"}"; GsonBuilder gsonBldr = new GsonBuilder(); gsonBldr.registerTypeAdapter(Foo.class, new FooDeserializerFromJsonWithDifferentFields()); Foo targetObject = gsonBldr.create().fromJson(json, Foo.class); assertEquals(targetObject.intValue, 7); assertEquals(targetObject.stringValue, "seven"); }

Perhatikan bahawa kami mendaftarkan deserializer khusus - ini dapat menguraikan bidang dengan betul dari tali json dan memetakannya ke Foo kami :

public class FooDeserializerFromJsonWithDifferentFields implements JsonDeserializer { @Override public Foo deserialize (JsonElement jElement, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jObject = jElement.getAsJsonObject(); int intValue = jObject.get("valueInt").getAsInt(); String stringValue = jObject.get("valueString").getAsString(); return new Foo(intValue, stringValue); } }

5. Mendesailkan JSON Array ke Java Array of Objects

Seterusnya, kita akan deserialize tatasusunan json menjadi lokasi Java daripada Foo objek:

@Test public void givenJsonArrayOfFoos_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. Deserialize JSON Array ke Java Collection

Seterusnya, susunan json terus ke Koleksi Java :

@Test public void givenJsonArrayOfFoos_whenDeserializingCollection_thenCorrect() { String json = "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]"; Type targetClassType = new TypeToken
    
     () { }.getType(); Collection targetCollection = new Gson().fromJson(json, targetClassType); assertThat(targetCollection, instanceOf(ArrayList.class)); }
    

7. Nyatakan JSON ke Objek Bersarang

Seterusnya, mari tentukan objek bersarang kami - FooWithInner :

public class FooWithInner { public int intValue; public String stringValue; public InnerFoo innerFoo; public class InnerFoo { public String name; } }

Berikut adalah cara mendeserisasi input yang mengandungi objek bersarang ini:

@Test public void whenDeserializingToNestedObjects_thenCorrect() { String json = "{\"intValue\":1,\"stringValue\":\"one\",\"innerFoo\":{\"name\":\"inner\"}}"; FooWithInner targetObject = new Gson().fromJson(json, FooWithInner.class); assertEquals(targetObject.intValue, 1); assertEquals(targetObject.stringValue, "one"); assertEquals(targetObject.innerFoo.name, "inner"); }

8. Deserialize JSON Menggunakan Custom Constructor

Akhirnya, mari kita lihat bagaimana memaksa menggunakan konstruktor tertentu semasa deserialization dan bukannya lalai - tidak ada argumen konstruktor - menggunakan InstanceCreator :

public class FooInstanceCreator implements InstanceCreator { @Override public Foo createInstance(Type type) { return new Foo("sample"); } }

Dan inilah cara menggunakan FooInstanceCreator kami dalam deserialisasi:

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

Perhatikan bahawa bukannya nol, Foo.stringValue sama dengan sampel kerana kami menggunakan pembina berikut:

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

9. Kesimpulannya

Artikel ini menunjukkan cara memanfaatkan perpustakaan Gson untuk menguraikan input JSON - membahas kes penggunaan yang paling biasa untuk objek tunggal dan pelbagai.

Pelaksanaan semua contoh dan coretan kod ini terdapat di projek github saya - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.