Serializačná kuchárska kniha Gson

V tomto článku sa pozrieme na najbežnejšie scenáre serializácie pomocou knižnice Gson.

Začnime predstavením jednoduchá entita ktoré použijeme v nasledujúcich príkladoch:

verejná trieda SourceClass {private int intValue; private String stringValue; // štandardné getre a setre}

1. Serializujte pole entít

Po prvé, poďme serializovať pole objektov s Gson:

@Test public void givenArrayOfObjects_whenSerializing_thenCorrect () {SourceClass [] sourceArray = {new SourceClass (1, "one"), new SourceClass (2, "two")}; Reťazec jsonString = nový Gson (). ToJson (sourceArray); String expectResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]" "; assertEquals (expectResult, jsonString); }

2. Serializujte zbierku entít

Ďalej urobíme to isté pre zbierku objektov:

@Test public void givenCollection_whenSerializing_thenCorrect () {Collection sourceCollection = Lists.newArrayList (new SourceClass (1, "one"), new SourceClass (2, "two")); Reťazec jsonCollection = nový Gson (). ToJson (sourceCollection); String expectResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]" "; assertEquals (expectResult, jsonCollection); }

3. Zmeňte názvy polí entity pri serializácii

Ďalej sa pozrime, ako môžeme zmeniť názov poľa keď serializujeme entitu.

Ideme serializovať našu entitu obsahujúcu polia intValue a hodnota reťazca do súboru JSON s otherIntValue a otherStringValue:

@Test public void givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect () {SourceClass sourceObject = nový SourceClass (7, „sedem“); GsonBuilder gsonBuildr = nový GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, nový DifferentNameSerializer ()); Reťazec jsonString = gsonBuildr.create (). ToJson (sourceObject); Reťazec expectResult = "{" otherIntValue ": 7," otherStringValue ":" seven "}"; assertEquals (expectResult, jsonString); }

Upozorňujeme, že tu používame vlastný serializátor na zmenu názvu našich polí:

verejná trieda DifferentNameSerializer implementuje JsonSerializer {@Override public JsonElement serialize (SourceClass src, typ typeOfSrc, JsonSerializationContext kontext) {String otherIntValueName = "otherIntValue"; Reťazec otherStringValueName = "otherStringValue"; JsonObject jObject = nový JsonObject (); jObject.addProperty (otherIntValueName, src.getIntValue ()); jObject.addProperty (otherStringValueName, src.getStringValue ()); návrat jObject; }}

4. Ignorujte pole pri serializácii entity

Poďme teraz pole úplne ignorovať pri vykonávaní serializácie:

@Test public void givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored () {SourceClass sourceObject = nový SourceClass (7, „sedem“); GsonBuilder gsonBuildr = nový GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, nový IgnoringFieldsSerializer ()); Reťazec jsonString = gsonBuildr.create (). ToJson (sourceObject); Reťazec expectResult = "{" intValue ": 7}"; assertEquals (expectResult, jsonString); }

Podobne ako v predchádzajúcom príklade, aj tu používame vlastný serializátor:

public class IgnoringFieldsSerializer implementuje JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String intValue = "intValue"; JsonObject jObject = nový JsonObject (); jObject.addProperty (intValue, src.getIntValue ()); návrat jObject; }}

Upozorňujeme tiež, že to s najväčšou pravdepodobnosťou musíme urobiť v prípadoch, keď nemôžeme zmeniť zdrojový kód entity, alebo ak by sa malo pole ignorovať iba vo veľmi špecifických prípadoch. Inak môžeme pole ľahšie ignorovať pomocou priamej anotácie k triede entít.

5. Serializujte pole, iba ak prejde vlastnou podmienkou

Na záver poďme analyzovať pokročilejší prípad použitia - pole chceme serializovať iba vtedy, ak splní konkrétnu vlastnú podmienku.

Napríklad poďme serializovať hodnotu int iba ak je kladná a jednoducho ju preskočme, ak je negatívna:

@Test public void givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored () {SourceClass sourceObject = nový SourceClass (-1, "mínus 1"); GsonBuilder gsonBuildr = nový GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, nový IgnoringFieldsNotMatchingCriteriaSerializer ()); Gson gson = gsonBuildr.create (); Typ sourceObjectType = nový TypeToken () {} .getType (); Reťazec jsonString = gson.toJson (sourceObject, sourceObjectType); Reťazec expectResult = "{" stringValue ":" mínus 1 "}"; assertEquals (expectResult, jsonString); }

Samozrejme, že používame vlastný serializátor aj tu:

verejná trieda IgnoringFieldsNotMatchingCriteriaSerializer implementuje JsonSerializer {@Override public JsonElement serialize (SourceClass src, typ typeOfSrc, kontext JsonSerializationContext) {JsonObject jObject = nový JsonObject (); // Kritériá: intValue> = 0 if (src.getIntValue ()> = 0) {String intValue = "intValue"; jObject.addProperty (intValue, src.getIntValue ()); } String stringValue = "stringValue"; jObject.addProperty (stringValue, src.getStringValue ()); return jObject; }}

A je to - 5 bežných prípadov použitia serializácia pomocou Gson.


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