Buku Resep Deserialisasi Gson

Dalam buku masak ini, kami menjelajahi berbagai cara untuk melepaskan JSON ke objek Java , menggunakan perpustakaan Gson yang populer.

1. Deserialisasi JSON ke Objek Dasar Tunggal

Mari kita mulai dengan sederhana - kita akan menguraikan json sederhana ke objek Java - Foo :

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

Dan solusinya:

@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. Deserialisasi JSON ke Objek Generik

Selanjutnya - mari kita definisikan objek menggunakan obat generik:

public class GenericFoo { public T theValue; }

Dan uraikan beberapa json ke jenis objek 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. Deserialisasi JSON Dengan Bidang Ekstra Tidak Dikenal ke Objek

Berikutnya - mari kita deserialisasi beberapa json kompleks yang berisi bidang 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 bidang yang tidak diketahui dan hanya mencocokkan bidang yang dapat dilakukannya.

4. Deserialisasi JSON Dengan Nama Bidang yang Tidak Cocok ke Objek

Sekarang, mari kita lihat bagaimana Gson melakukannya dengan string json yang berisi bidang yang tidak cocok dengan bidang objek Foo kita :

@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 bahwa kami mendaftarkan deserializer khusus - ini dapat mengurai bidang dari string json dengan benar 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. Deserialize JSON Array ke Java Array of Objects

Selanjutnya, kita akan deserialisasi array json menjadi array Java dari objek Foo :

@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. Deserialisasi Array JSON ke Koleksi Java

Selanjutnya, array json langsung 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. Deserialisasi JSON ke Objek Bersarang

Selanjutnya, mari tentukan objek bersarang kita - FooWithInner :

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

Dan berikut adalah cara deserialisasi input yang berisi 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

Terakhir, mari kita lihat cara memaksa menggunakan konstruktor tertentu selama deserialisasi alih-alih default - tidak ada konstruktor argumen - 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 bahwa alih-alih null, Foo.stringValue sama dengan sampel karena kami menggunakan konstruktor berikut:

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

9. Kesimpulan

Artikel ini menunjukkan cara memanfaatkan pustaka Gson untuk mengurai input JSON - membahas kasus penggunaan paling umum untuk objek tunggal dan ganda.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek github saya - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankan apa adanya.