Gson Serialization Cookbook

Ebben a cikkben megvizsgáljuk a Gson könyvtár használatával történő sorozatosítás leggyakoribb forgatókönyveit.

Kezdjük a bevezetéssel egyszerű entitás amelyet a következő példákban fogunk használni:

public class SourceClass {private int intValue; privát String stringValue; // szabványos mérőeszközök és beállítók}

1. Serializálja az entitások tömbjét

Először sorosítsunk egy sor objektumot a Gson segítségével:

@Test public void givenArrayOfObjects_whenSerializing_thenCorrect () {SourceClass [] sourceArray = {new SourceClass (1, "one"), new SourceClass (2, "two")}; Karakterlánc jsonString = új Gson (). ToJson (sourceArray); String várhatóResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (várható eredmény, jsonString); }

2. Serializálja az entitások gyűjteményét

Ezután tegyük ugyanezt egy objektumgyűjtemény esetében is:

@Test public void givenCollection_whenSerializing_thenCorrect () {Collection sourceCollection = Lists.newArrayList (új SourceClass (1, "egy"), új SourceClass (2, "kettő")); Karakterlánc jsonCollection = új Gson (). ToJson (sourceCollection); String várhatóResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (várható eredmény, jsonCollection); }

3. Módosítsa egy entitás mezőnevét a sorozatosítás során

Ezután nézzük meg, hogyan tudunk módosítsa a mező nevét amikor egy entitást sorosítunk.

Sorosítani fogjuk entitásunkat, amely tartalmazza a mezőket intValue és stringValue egy jsonnak otherIntValue és otherStringValue:

@Test public void givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect () {SourceClass sourceObject = new SourceClass (7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, új DifferentNameSerializer ()); Karakterlánc jsonString = gsonBuildr.create (). ToJson (sourceObject); String várhatóResult = "{" otherIntValue ": 7," otherStringValue ":" hét "}"; assertEquals (várható eredmény, jsonString); }

Ne feledje, hogy itt egyedi sorosítót használunk a mezők nevének megváltoztatásához:

public class A DifferentNameSerializer megvalósítja a JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String otherIntValueName = "otherIntValue"; String otherStringValueName = "otherStringValue"; JsonObject jObject = új JsonObject (); jObject.addProperty (egyébIntValueName, src.getIntValue ()); jObject.addProperty (otherStringValueName, src.getStringValue ()); return jObject; }}

4. Hagyjon figyelmen kívül egy mezőt egy entitás sorosítása során

Nézzük most teljesen figyelmen kívül hagy egy mezőt a sorosítás végrehajtásakor:

@Test public void givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored () {SourceClass sourceObject = new SourceClass (7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, új IgnoringFieldsSerializer ()); Karakterlánc jsonString = gsonBuildr.create (). ToJson (sourceObject); String várhatóResult = "{" intValue ": 7}"; assertEquals (várható eredmény, jsonString); }

Az előző példához hasonlóan itt is használunk egyedi sorosítót:

public class Az IgnoringFieldsSerializer megvalósítja a JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String intValue = "intValue"; JsonObject jObject = új JsonObject (); jObject.addProperty (intValue, src.getIntValue ()); return jObject; }}

Vegye figyelembe azt is, hogy erre nagy valószínűséggel olyan esetekben van szükségünk, amikor az entitás forráskódját nem tudjuk megváltoztatni, vagy ha a mezőt csak nagyon meghatározott esetekben szabad figyelmen kívül hagyni. Ellenkező esetben könnyebben figyelmen kívül hagyhatjuk a mezőt az entitásosztály közvetlen megjegyzésével.

5. Csak akkor szériaszámosítson egy mezőt, ha az megfelel egy egyéni feltételnek

Végül elemezzünk egy fejlettebb felhasználási módot - csak akkor szeretnénk sorosítani egy mezőt, ha az megfelel egy adott, egyedi feltételnek.

Például csak akkor sorosítsuk az int értéket, ha az pozitív, és egyszerűen hagyjuk ki, ha negatív:

@Test public void givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored () {SourceClass sourceObject = new SourceClass (-1, "mínusz 1"); GsonBuilder gsonBuildr = new GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, új IgnoringFieldsNotMatchingCriteriaSerializer ()); Gson gson = gsonBuildr.create (); Type sourceObjectType = new TypeToken () {} .getType (); Karakterlánc jsonString = gson.toJson (sourceObject, sourceObjectType); String várhatóResult = "{" stringValue ":" mínusz 1 "}"; assertEquals (várható eredmény, jsonString); }

Természetesen használjuk egyedi sorosító itt is:

public class IgnoringFieldsNotMatchingCriteriaSerializer megvalósítja a JsonSerializer {@Orride public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {JsonObject jObject = new JsonObject (); // Feltételek: intValue> = 0 if (src.getIntValue ()> = 0) {String intValue = "intValue"; jObject.addProperty (intValue, src.getIntValue ()); } String stringValue = "stringValue"; jObject.addProperty (stringValue, src.getStringValue ()); return jObject; }}

És ennyi - 5 gyakori használat sorosítás Gson segítségével.