Buku Masakan Serialisasi Gson

Dalam artikel ini kita akan melihat senario serialisasi yang paling biasa menggunakan perpustakaan Gson.

Mari kita mulakan dengan memperkenalkan entiti mudah yang akan kita gunakan melalui contoh berikut:

public class SourceClass { private int intValue; private String stringValue; // standard getters and setters }

1. Serial Array of Entities

Pertama, mari kita sirikan pelbagai objek dengan Gson:

@Test public void givenArrayOfObjects_whenSerializing_thenCorrect() { SourceClass[] sourceArray = {new SourceClass(1, "one"), new SourceClass(2, "two")}; String jsonString = new Gson().toJson(sourceArray); String expectedResult = "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]"; assertEquals(expectedResult, jsonString); }

2. Serialkan Koleksi Entiti

Seterusnya, mari kita melakukan perkara yang sama untuk Koleksi objek:

@Test public void givenCollection_whenSerializing_thenCorrect() { Collection sourceCollection = Lists.newArrayList(new SourceClass(1, "one"), new SourceClass(2, "two")); String jsonCollection = new Gson().toJson(sourceCollection); String expectedResult = "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]"; assertEquals(expectedResult, jsonCollection); }

3. Tukar Nama Medan Entiti pada Serialisasi

Seterusnya, mari kita lihat bagaimana kita dapat mengubah nama bidang ketika kita membuat siri entiti.

Kami akan membuat siri entiti kami, yang mengandungi medan intValue dan stringValue ke json denganIntValue lain dan nilai laintring :

@Test public void givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect() { SourceClass sourceObject = new SourceClass(7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new DifferentNameSerializer()); String jsonString = gsonBuildr.create().toJson(sourceObject); String expectedResult = "{"otherIntValue":7,"otherStringValue":"seven"}"; assertEquals(expectedResult, jsonString); }

Perhatikan bahawa kami menggunakan alat penyesuai khas di sini untuk menukar nama bidang kami:

public class DifferentNameSerializer implements JsonSerializer { @Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) { String otherIntValueName = "otherIntValue"; String otherStringValueName = "otherStringValue"; JsonObject jObject = new JsonObject(); jObject.addProperty(otherIntValueName, src.getIntValue()); jObject.addProperty(otherStringValueName, src.getStringValue()); return jObject; } }

4. Abaikan Medan Semasa Menggabungkan Entiti

Sekarang mari kita abaikan bidang sepenuhnya semasa melakukan siri:

@Test public void givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored() { SourceClass sourceObject = new SourceClass(7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new IgnoringFieldsSerializer()); String jsonString = gsonBuildr.create().toJson(sourceObject); String expectedResult = "{"intValue":7}"; assertEquals(expectedResult, jsonString); }

Sama seperti contoh sebelumnya, kami juga menggunakan alat penyesuai khas di sini:

public class IgnoringFieldsSerializer implements JsonSerializer { @Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) { String intValue = "intValue"; JsonObject jObject = new JsonObject(); jObject.addProperty(intValue, src.getIntValue()); return jObject; } }

Perhatikan juga bahawa kemungkinan besar kita perlu melakukan ini dalam kes di mana kita tidak dapat mengubah kod sumber entiti, atau jika bidang tersebut hanya harus diabaikan kes yang sangat spesifik. Jika tidak, kita boleh mengabaikan bidang dengan lebih mudah dengan anotasi langsung pada kelas entiti.

5. Serialkan Medan Hanya Jika Melepasi Keadaan Tersuai

Akhirnya, mari kita menganalisis kes pengguna yang lebih maju - kami hanya mahu membuat siri medan jika melewati keadaan khusus dan khusus.

Sebagai contoh, mari kita serikan nilai int jika positif dan langkau jika negatif:

@Test public void givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored() { SourceClass sourceObject = new SourceClass(-1, "minus 1"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new IgnoringFieldsNotMatchingCriteriaSerializer()); Gson gson = gsonBuildr.create(); Type sourceObjectType = new TypeToken() {}.getType(); String jsonString = gson.toJson(sourceObject, sourceObjectType); String expectedResult = "{"stringValue":"minus 1"}"; assertEquals(expectedResult, jsonString); }

Sudah tentu kami menggunakan serializer khas di sini juga:

public class IgnoringFieldsNotMatchingCriteriaSerializer implements JsonSerializer { @Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) { JsonObject jObject = new JsonObject(); // Criteria: intValue >= 0 if (src.getIntValue() >= 0) { String intValue = "intValue"; jObject.addProperty(intValue, src.getIntValue()); } String stringValue = "stringValue"; jObject.addProperty(stringValue, src.getStringValue()); return jObject; } }

Dan itu sahaja - 5 penggunaan siri yang biasa menggunakan Gson .