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.