この記事では、https://code.google.com/p/google-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つの一般的なユースケースです。