本格派エンジニアの工具箱

第27回 JSONデータを扱うためのJavaライブラリ「Jackson Java JSON-processor」

この記事を読むのに必要な時間:およそ 4 分

ストリーミングAPIでJSONデータを作成する

続いて,ストリーミングAPIを使ってJSON形式のデータを作成してみましょう。JSONデータの作成にはJsonGeneratorクラスを使用します。JsonGeneratorのインスタンスはJsonFactoryクラスのcreateJsonGenerator()メソッドを使って次のように行います。

// JsonFactoryの生成
JsonFactory jsonFactory = new JsonFactory();
// JsonGeneratorの取得
JsonGenerator generator = 
    jsonFactory.createJsonGenerator(new File("output.json"), JsonEncoding.UTF8);

上記のようにした場合,最終的にourput.jsonという名前のファイルにUTF-8形式でデータが出力されることになります。Fileオブジェクトの他に出力ストリームを対象にすることもできます。

このJsonGeneratorオブジェクトに対して,writeXXXX()のメソッドを使ってデータを追加していきます。例えば「{"first":"太郎","last":"技評"}」というようなデータを作成したい場合には次のようなコードになります。

generator.writeStartObject();
generator.writeFieldName("first");
generator.writeString("太郎");
generator.writeFieldName("last");
generator.writeString("技評");
generator.writeEndObject();

writeStartObject()とwriteEndObject()はオブジェクトの開始と終了を,writeFieldName()はフィールド名を,writeString()は文字列形式の値を追加するメソッドです。文字列形式のデータは,writeTextField()メソッドを使ってフィールド名と値をセットにして追加することもできます。

最後に,flush()メソッドを実行することで,作成されたデータが対象のファイルやストリームに出力されます。次の例は,配列やオブジェクトのネストを含んだデータを出力する例です。

// JsonFactoryの生成
JsonFactory jsonFactory = new JsonFactory();
// JsonGeneratorの取得
JsonGenerator generator = 
    jsonFactory.createJsonGenerator(new File("output.json"), JsonEncoding.UTF8);

// 配列の開始
generator.writeStartArray();
      
// オブジェクトの書き込み
generator.writeStartObject();
generator.writeFieldName("name");
generator.writeStartObject();
generator.writeStringField("first", "太郎");
generator.writeStringField("last", "技評");
generator.writeEndObject();
generator.writeStringField("email", "tato@example.jp");
generator.writeEndObject();

// オブジェクトの書き込み
generator.writeStartObject();
generator.writeFieldName("name");
generator.writeStartObject();
generator.writeStringField("first", "次郎");
generator.writeStringField("last", "技術");
generator.writeEndObject();
generator.writeStringField("email", "jiro@example.jp");
generator.writeEndObject();

// 配列の終わり
generator.writeEndArray();

// ファイルへの書き出し
generator.flush();

このコードによる出力例は次のようになります(見やすいように改行を入れてあります)⁠

[{
  "name":{"first":"太郎","last":"技評"},
  "email":"tato@example.jp"
},{
  "name":{"first":"次郎","last":"技術"},
  "email":"jiro@example.jp"
}]

このように,ストリーミングAPIでは先頭から順番にデータを扱うため,処理がシンプルで極めて高速に動作します。一方で,特定のデータをピンポイントで取り出したい場合などには向いていませんです。そこで,もう少し柔軟なデータへのアクセスができる方法としてツリーモデルのAPIがあります。次回はその使い方を解説します。

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書

コメント

コメントの記入