Gson Serialization Cookbook

I denne artikkelen skal vi se på de vanligste scenariene for serialisering ved hjelp av Gson-biblioteket.

La oss starte med å introdusere en enkel enhet som vi skal bruke gjennom følgende eksempler:

offentlig klasse SourceClass {privat intValue; privat streng strengverdi; // standard getters og setters}

1. Serialize an Array of Entities

La oss først serieisere en rekke objekter med Gson:

@Test offentlig ugyldig 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 enheter

Deretter la oss gjøre det samme for en samling objekter:

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

3. Endre feltnavn på en enhet ved serialisering

La oss se hvordan vi kan endre navnet på feltet når vi serierer en enhet.

Vi kommer til å serieisere enheten vår, som inneholder feltene intValue og strengverdi til en json med otherIntValue og otherStringValue:

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

Vær oppmerksom på at vi bruker en tilpasset serielliser her for å endre navnet på feltene våre:

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 du serialiserer en enhet

La oss nå ignorere et felt helt når du utfører serialisasjonen:

@Test offentlig ugyldighet gittIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored () {SourceClass sourceObject = ny SourceClass (7, "sju"); GsonBuilder gsonBuildr = nye GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, ny IgnoringFieldsSerializer ()); String jsonString = gsonBuildr.create (). ToJson (sourceObject); String expectResult = "{" intValue ": 7}"; assertEquals (expectResult, jsonString); }

I likhet med forrige eksempel bruker vi også en tilpasset serielliser her:

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; }}

Vær også oppmerksom på at vi sannsynligvis trenger å gjøre dette i tilfeller der vi ikke kan endre kildekoden til enheten, eller hvis feltet bare skal ignoreres veldig spesifikke tilfeller. Ellers kan vi ignorere feltet lettere med en direkte merknad på enhetsklassen.

5. Serialiser et felt bare hvis det oppfyller en tilpasset tilstand

Til slutt, la oss analysere en mer avansert brukstilfelle - vi vil bare serieisere et felt hvis det passerer en bestemt, tilpasset tilstand.

La oss for eksempel bare serieint-verdien hvis den er positiv, og bare hoppe over den hvis den er negativ:

@Test offentlig ugyldighet givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored () {SourceClass sourceObject = ny SourceClass (-1, "minus 1"); GsonBuilder gsonBuildr = nye GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, new 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 bruker vi en tilpasset serielliser 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 vanlige brukstilfeller av serialisering ved hjelp av Gson.


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