Gson kuharica za serializaciju

U ovom ćemo članku pogledati najčešće scenarije serializacije pomoću Gson knjižnice.

Krenimo s predstavljanjem jednostavan entitet koje ćemo koristiti u sljedećim primjerima:

javna klasa SourceClass {private int intValue; private String stringValue; // standardni geteri i postavljači}

1. Serijalizirajte niz entiteta

Prvo, hajde da serializiramo niz objekata s Gson:

@Test javna praznina givenArrayOfObjects_whenSerializing_thenCorrect () {SourceClass [] sourceArray = {new SourceClass (1, "one"), new SourceClass (2, "two")}; Niz jsonString = novi Gson (). ToJson (sourceArray); Niz očekujeResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (očekivani rezultat, jsonString); }

2. Serijalizirati zbirku entiteta

Dalje, učinimo isto za Zbirku predmeta:

@Test javna praznina givenCollection_whenSerializing_thenCorrect () {Collection sourceCollection = Lists.newArrayList (new SourceClass (1, "one"), new SourceClass (2, "two")); Niz jsonCollection = novi Gson (). ToJson (sourceCollection); Niz očekujeResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (očekivani rezultat, jsonCollection); }

3. Promijenite imena polja entiteta na serializaciji

Dalje, da vidimo kako možemo promijenite ime polja kada serializiramo entitet.

Serijalizirat ćemo svoj entitet koji sadrži polja intValue i stringValue jsonu s otherIntValue i otherStringValue:

@Test javna praznina givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect () {SourceClass sourceObject = novi SourceClass (7, "sedam"); GsonBuilder gsonBuildr = novi GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, novi DifferentNameSerializer ()); Niz jsonString = gsonBuildr.create (). ToJson (sourceObject); Niz očekujeResult = "{" otherIntValue ": 7," otherStringValue ":" sedam "}"; assertEquals (očekivani rezultat, jsonString); }

Imajte na umu da ovdje koristimo prilagođeni serializator za promjenu imena naših polja:

javna klasa DifferentNameSerializer implementira JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String otherIntValueName = "otherIntValue"; Niz otherStringValueName = "otherStringValue"; JsonObject jObject = novi JsonObject (); jObject.addProperty (otherIntValueName, src.getIntValue ()); jObject.addProperty (otherStringValueName, src.getStringValue ()); povratak jObject; }}

4. Zanemari polje prilikom serializacije entiteta

Idemo sada potpuno zanemariti polje prilikom izvođenja serializacije:

@Test javna praznina givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored () {SourceClass sourceObject = novi SourceClass (7, "sedam"); GsonBuilder gsonBuildr = novi GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, novi IgnoringFieldsSerializer ()); Niz jsonString = gsonBuildr.create (). ToJson (sourceObject); Niz očekujeResult = "{" intValue ": 7}"; assertEquals (očekivani rezultat, jsonString); }

Slično prethodnom primjeru, i ovdje koristimo prilagođeni serializator:

javna klasa IgnoringFieldsSerializer implementira JsonSerializer {@Override public JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String intValue = "intValue"; JsonObject jObject = novi JsonObject (); jObject.addProperty (intValue, src.getIntValue ()); povratak jObject; }}

Također imajte na umu da to najvjerojatnije trebamo učiniti u slučajevima kada ne možemo promijeniti izvorni kod entiteta ili ako polje treba zanemariti samo vrlo specifične slučajeve. Inače možemo lakše ignorirati polje izravnom bilješkom na klasi entiteta.

5. Serijalizirajte polje samo ako prođe prilagođeni uvjet

Na kraju, analizirajmo napredniji slučaj upotrebe - polje želimo serializirati samo ako ono prolazi određeno, prilagođeno stanje.

Na primjer, neka seriziramo int vrijednost samo ako je pozitivna i jednostavno je preskočimo ako je negativna:

@Test javna praznina givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored () {SourceClass sourceObject = novi SourceClass (-1, "minus 1"); GsonBuilder gsonBuildr = novi GsonBuilder (); gsonBuildr.registerTypeAdapter (SourceClass.class, novi IgnoringFieldsNotMatchingCriteriaSerializer ()); Gson gson = gsonBuildr.create (); Upišite sourceObjectType = novi TypeToken () {} .getType (); Niz jsonString = gson.toJson (sourceObject, sourceObjectType); Niz očekujeResult = "{" stringValue ":" minus 1 "}"; assertEquals (očekivani rezultat, jsonString); }

Naravno da koristimo prilagođeni serializator ovdje također:

javna klasa IgnoringFieldsNotMatchingCriteriaSerializer implementira JsonSerializer {@Override javni JsonElement serialize (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {JsonObject jObject = new JsonObject (); // Kriteriji: intValue> = 0 if (src.getIntValue ()> = 0) {String intValue = "intValue"; jObject.addProperty (intValue, src.getIntValue ()); } Niz stringValue = "stringValue"; jObject.addProperty (stringValue, src.getStringValue ()); povratak jObject; }}

I to je to - 5 uobičajenih slučajeva serializacija pomoću Gsona.


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