Gson Serialization Cookbook

I denne artikel vil vi se på de mest almindelige scenarier for serialisering ved hjælp af Gson-biblioteket.

Lad os starte med at introducere en simpel enhed som vi skal bruge gennem følgende eksempler:

offentlig klasse SourceClass {privat intValue; private String stringValue; // standard getters og setter}

1. Serialiser en række enheder

Lad os først serialisere en række objekter med Gson:

@Test offentlig ugyldighed givenArrayOfObjects_whenSerializing_thenCorrect () {SourceClass [] sourceArray = {new SourceClass (1, "one"), new SourceClass (2, "two")}; String jsonString = ny Gson (). ToJson (sourceArray); String expectResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (expectResult, jsonString); }

2. Serialiser en samling enheder

Lad os derefter gøre det samme for en samling objekter:

@Test offentlig ugyldighed givenCollection_whenSerializing_thenCorrect () {Collection sourceCollection = Lists.newArrayList (new SourceClass (1, "one"), new SourceClass (2, "two")); Streng jsonCollection = ny Gson (). Til Json (sourceCollection); String expectResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (expectResult, jsonCollection); }

3. Skift feltnavne på en enhed ved serialisering

Lad os derefter se, hvordan vi kan ændre navnet på feltet når vi serieliserer en enhed.

Vi serierer vores enhed med felterne intValue og stringValue til en json med andetIntVærdi og otherStringValue:

@Test offentlig ugyldighed givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect () {SourceClass sourceObject = ny SourceClass (7, "syv"); GsonBuilder gsonBuildr = ny GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, ny DifferentNameSerializer ()); String jsonString = gsonBuildr.create (). ToJson (sourceObject); String expectResult = "{" otherIntValue ": 7," otherStringValue ":" syv "}"; assertEquals (expectResult, jsonString); }

Bemærk, at vi bruger en brugerdefineret serializer her til at ændre navnet på vores felter:

offentlig klasse DifferentNameSerializer implementerer JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String otherIntValueName = "otherIntValue"; String otherStringValueName = "otherStringValue"; JsonObject jObject = ny JsonObject (); jObject.addProperty (otherIntValueName, src.getIntValue ()); jObject.addProperty (otherStringValueName, src.getStringValue ()); returnere jObject; }}

4. Ignorer et felt, når en enhed serialiseres

Lad os nu ignorere et felt fuldstændigt når du udfører serialisering:

@Test offentlig ugyldighed givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored () {SourceClass sourceObject = ny SourceClass (7, "syv"); GsonBuilder gsonBuildr = ny GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, ny IgnoringFieldsSerializer ()); String jsonString = gsonBuildr.create (). ToJson (sourceObject); Streng forventet resultat = "{" intValue ": 7}"; assertEquals (expectResult, jsonString); }

I lighed med det foregående eksempel bruger vi også en brugerdefineret serializer:

offentlig klasse IgnoringFieldsSerializer implementerer JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String intValue = "intValue"; JsonObject jObject = ny JsonObject (); jObject.addProperty (intValue, src.getIntValue ()); returnere jObject; }}

Bemærk også, at vi sandsynligvis har brug for at gøre dette i tilfælde, hvor vi ikke kan ændre enhedens kildekode, eller hvis feltet kun skal ignoreres meget specifikke tilfælde. Ellers kan vi ignorere feltet lettere med en direkte kommentar på enhedsklassen.

5. Serialiser kun et felt, hvis det er i overensstemmelse med en brugerdefineret tilstand

Lad os endelig analysere en mere avanceret usecase - vi vil kun serieere et felt, hvis det passerer en bestemt, brugerdefineret tilstand.

Lad os for eksempel kun serieisere int-værdien, hvis den er positiv, og bare springe den over, hvis den er negativ:

@Test offentlig ugyldighed givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored () {SourceClass sourceObject = ny SourceClass (-1, "minus 1"); GsonBuilder gsonBuildr = ny GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, ny IgnoringFieldsNotMatchingCriteriaSerializer ()); Gson gson = gsonBuildr.create (); Skriv sourceObjectType = ny TypeToken () {} .getType (); String jsonString = gson.toJson (sourceObject, sourceObjectType); String expectResult = "{" stringValue ":" minus 1 "}"; assertEquals (expectResult, jsonString); }

Selvfølgelig bruger vi det en tilpasset serializer også her:

offentlig klasse IgnoringFieldsNotMatchingCriteriaSerializer implementerer JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {JsonObject jObject = new JsonObject (); // Kriterier: intValue> = 0 hvis (src.getIntValue ()> = 0) {String intValue = "intValue"; jObject.addProperty (intValue, src.getIntValue ()); } String stringValue = "stringValue"; jObject.addProperty (stringValue, src.getStringValue ()); returnere jObject; }}

Og det er det - 5 almindelige anvendelser af serialisering ved hjælp af Gson.


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