Google gson の toJson と 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)
と例外を発生させてしまうので、忘れてはいけない。