Gson-serialisatiekookboek

In dit artikel gaan we kijken naar de meest voorkomende scenario's van serialisatie met behulp van de Gson-bibliotheek.

Laten we beginnen met een introductie een eenvoudige entiteit die we gaan gebruiken in de volgende voorbeelden:

openbare klasse SourceClass {private int intValue; private String stringValue; // standaard getters en setters}

1. Serialiseer een reeks entiteiten

Laten we eerst een reeks objecten serialiseren met Gson:

@Test openbare leegte gegevenArrayOfObjects_whenSerializing_thenCorrect () {SourceClass [] sourceArray = {nieuwe SourceClass (1, "één"), nieuwe SourceClass (2, "twee")}; String jsonString = nieuwe Gson (). ToJson (sourceArray); String verwachteResult = "[{" intValue ": 1," stringValue ":" een "}, {" intValue ": 2," stringValue ":" twee "}]"; assertEquals (verwachtResultaat, jsonString); }

2. Serialiseer een verzameling entiteiten

Laten we vervolgens hetzelfde doen voor een verzameling objecten:

@Test openbare leegte gegevenCollection_whenSerializing_thenCorrect () {Collectie sourceCollection = Lists.newArrayList (nieuwe SourceClass (1, "één"), nieuwe SourceClass (2, "twee")); String jsonCollection = nieuwe Gson (). ToJson (sourceCollection); String verwachteResult = "[{" intValue ": 1," stringValue ":" een "}, {" intValue ": 2," stringValue ":" twee "}]"; assertEquals (verwachtResultaat, jsonCollection); }

3. Wijzig de veldnamen van een entiteit bij serialisering

Laten we vervolgens kijken hoe we dat kunnen doen verander de naam van het veld wanneer we een entiteit serialiseren.

We gaan onze entiteit serialiseren, met daarin de velden intValue en tekenreekswaarde naar een json met otherIntValue en otherStringValue:

@Test openbare leegte gegevenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect () {SourceClass sourceObject = nieuwe SourceClass (7, "zeven"); GsonBuilder gsonBuildr = nieuwe GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, nieuwe DifferentNameSerializer ()); String jsonString = gsonBuildr.create (). ToJson (sourceObject); String verwachteResult = "{" otherIntValue ": 7," otherStringValue ":" seven "}"; assertEquals (verwachtResultaat, jsonString); }

Merk op dat we hier een aangepaste serialisator gebruiken om de naam van onze velden te wijzigen:

public class DifferentNameSerializer implementeert JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String otherIntValueName = "otherIntValue"; String otherStringValueName = "otherStringValue"; JsonObject jObject = nieuw JsonObject (); jObject.addProperty (otherIntValueName, src.getIntValue ()); jObject.addProperty (otherStringValueName, src.getStringValue ()); terug jObject; }}

4. Negeer een veld bij het serialiseren van een entiteit

Laten we nu negeer een veld volledig bij het uitvoeren van de serialisering:

@Test openbare ongeldige gegevenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored () {SourceClass sourceObject = nieuwe SourceClass (7, "zeven"); GsonBuilder gsonBuildr = nieuwe GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, nieuwe IgnoringFieldsSerializer ()); String jsonString = gsonBuildr.create (). ToJson (sourceObject); String verwachteResult = "{" intValue ": 7}"; assertEquals (verwachtResultaat, jsonString); }

Net als in het vorige voorbeeld gebruiken we hier ook een aangepaste serialisator:

public class IgnoringFieldsSerializer implementeert JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String intValue = "intValue"; JsonObject jObject = nieuw JsonObject (); jObject.addProperty (intValue, src.getIntValue ()); terug jObject; }}

Merk ook op dat we dit hoogstwaarschijnlijk moeten doen in gevallen waarin we de broncode van de entiteit niet kunnen wijzigen, of als het veld alleen in zeer specifieke gevallen moet worden genegeerd. Anders kunnen we het veld gemakkelijker negeren met een directe annotatie op de entiteitsklasse.

5. Serialiseer een veld alleen als het aan een aangepaste voorwaarde voldoet

Laten we tot slot een meer geavanceerde usecase analyseren - we willen een veld alleen serialiseren als het voldoet aan een specifieke, aangepaste voorwaarde.

Laten we bijvoorbeeld de int-waarde alleen serialiseren als deze positief is en deze gewoon overslaan als deze negatief is:

@Test openbare ongeldig gegevenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored () {SourceClass sourceObject = nieuwe SourceClass (-1, "minus 1"); GsonBuilder gsonBuildr = nieuwe GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, nieuwe IgnoringFieldsNotMatchingCriteriaSerializer ()); Gson gson = gsonBuildr.create (); Typ sourceObjectType = nieuw TypeToken () {} .getType (); String jsonString = gson.toJson (sourceObject, sourceObjectType); String verwachteResult = "{" stringValue ":" minus 1 "}"; assertEquals (verwachtResultaat, jsonString); }

Natuurlijk gebruiken we een aangepaste serialisator hier ook:

public class IgnoringFieldsNotMatchingCriteriaSerializer implementeert JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {JsonObject jObject = new JsonObject (); // Criteria: intValue> = 0 if (src.getIntValue ()> = 0) {String intValue = "intValue"; jObject.addProperty (intValue, src.getIntValue ()); } String stringValue = "stringValue"; jObject.addProperty (stringValue, src.getStringValue ()); terug jObject; }}

En dat is alles - 5 veelvoorkomende toepassingen van serialisatie met Gson.