Готварска книга за сериализация на Gson

В тази статия ще разгледаме най-често срещаните сценарии за сериализация с помощта на библиотеката Gson.

Нека започнем с въвеждането на прост обект , който ще използваме в следните примери:

public class SourceClass { private int intValue; private String stringValue; // standard getters and setters }

1. Сериализирайте масив от обекти

Първо, нека сериализираме масив от обекти с Gson:

@Test public void givenArrayOfObjects_whenSerializing_thenCorrect() { SourceClass[] sourceArray = {new SourceClass(1, "one"), new SourceClass(2, "two")}; String jsonString = new Gson().toJson(sourceArray); String expectedResult = "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]"; assertEquals(expectedResult, jsonString); }

2. Сериализирайте колекция от обекти

След това нека направим същото за колекция от обекти:

@Test public void givenCollection_whenSerializing_thenCorrect() { Collection sourceCollection = Lists.newArrayList(new SourceClass(1, "one"), new SourceClass(2, "two")); String jsonCollection = new Gson().toJson(sourceCollection); String expectedResult = "[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]"; assertEquals(expectedResult, jsonCollection); }

3. Променете имената на полета на обект при сериализация

След това нека видим как можем да променим името на полето, когато сериализираме обект.

Ще сериализираме нашия обект, съдържащ полетата intValue и stringValue до json с otherIntValue и otherStringValue :

@Test public void givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect() { SourceClass sourceObject = new SourceClass(7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new DifferentNameSerializer()); String jsonString = gsonBuildr.create().toJson(sourceObject); String expectedResult = "{"otherIntValue":7,"otherStringValue":"seven"}"; assertEquals(expectedResult, jsonString); }

Имайте предвид, че тук използваме персонализиран сериализатор, за да променим името на нашите полета:

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

4. Игнорирайте поле при сериализиране на обект

Нека сега игнорираме полето напълно при извършване на сериализацията:

@Test public void givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored() { SourceClass sourceObject = new SourceClass(7, "seven"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new IgnoringFieldsSerializer()); String jsonString = gsonBuildr.create().toJson(sourceObject); String expectedResult = "{"intValue":7}"; assertEquals(expectedResult, jsonString); }

Подобно на предишния пример, и тук използваме персонализиран сериализатор:

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

Също така имайте предвид, че най-вероятно трябва да направим това в случаите, когато не можем да променим изходния код на обекта или ако полето трябва да се игнорира само в много специфични случаи. В противен случай можем да игнорираме полето по-лесно с директна анотация на класа на обекта.

5. Сериализирайте поле само ако то преминава потребителско условие

И накрая, нека анализираме по-усъвършенствана употреба - искаме да сериализираме поле само ако то преминава конкретно, персонализирано състояние.

Например, нека сериализираме стойността int само ако е положителна и просто да я пропуснем, ако е отрицателна:

@Test public void givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored() { SourceClass sourceObject = new SourceClass(-1, "minus 1"); GsonBuilder gsonBuildr = new GsonBuilder(); gsonBuildr.registerTypeAdapter(SourceClass.class, new IgnoringFieldsNotMatchingCriteriaSerializer()); Gson gson = gsonBuildr.create(); Type sourceObjectType = new TypeToken() {}.getType(); String jsonString = gson.toJson(sourceObject, sourceObjectType); String expectedResult = "{"stringValue":"minus 1"}"; assertEquals(expectedResult, jsonString); }

Разбира се , и тук използваме персонализиран сериализатор :

public class IgnoringFieldsNotMatchingCriteriaSerializer implements 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()); return jObject; } }

И това е - 5 често използвани случая на сериализация с помощта на Gson .