Gson の toJson と JsonWriter を併用する

Google gsontoJson JsonWriter は、どちらか一方を使うことが多かった。
toJson(Object src, Type typeOfSrc) だけでなく、
toJson には、JsonWriter に結果を書き込むメソッドも用意されている。

JsonWriter で書きながら、途中で任意のクラスオブジェクトを突然、JSON 書込みに
割り込んで toJson で生成したJSONを割り込ませる。
ということが可能だ。

toJson(Object src, Type typeOfSrc, JsonWriter writer) 

以下のように使う。
サンプル

import java.io.IOException;
import java.io.PrintWriter;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonWriter;
Gson gson = new GsonBuilder()
      .serializeNulls()
      .create();

try(JsonWriter writer = new JsonWriter(new PrintWriter(System.out))){
   writer.setIndent("  ");
   writer.beginObject();

   writer.name("name").value("Uranus");
   writer.name("admin").value(false);

   // name で作成した JsonWriter を toJson に渡す
   JsonWriter writer2 = writer.name("sample");

   gson.toJson(new Sample(), TypeToken.get(Sample.class).getType(), writer2);

   writer.endObject();
}catch(IOException e){
   e.printStackTrace();
}

JsonWriter の nameメソッド で作成した JsonWriter を toJson に渡す
結果、標準出力

{
  "name": "Uranus",
  "admin": false,
  "sample": {
    "title": "あいう",
    "name": "A",
    "value": 121
  }
}

JsonWriterで注意しなければならないのは、最後に、endObject() を実行するのを忘れてしまうと、
java.io.IOException: Incomplete document
at com.google.gson.stream.JsonWriter.close(JsonWriter.java:559)

と例外を発生させてしまうので、忘れてはいけない。