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<SourceClass> 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を含むエンティティをotherIntValueとotherStringValueを使用してjsonにシリアル化します。
@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<SourceClass> {
@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<SourceClass> {
@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<SourceClass>() {}.getType();
String jsonString = gson.toJson(sourceObject, sourceObjectType);
String expectedResult = "{"stringValue":"minus 1"}";
assertEquals(expectedResult, jsonString);
}
もちろん、ここでもカスタムシリアライザーを使用しています。
public class IgnoringFieldsNotMatchingCriteriaSerializer
implements JsonSerializer<SourceClass> {
@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;
}
}
以上です–Gsonを使用したシリアル化の5つの一般的なユースケース。