「Jackson Java JSON-processor」とは
近年のWebアプリケーション開発では、
それに伴い、
今回は、
- ストーミングAPIによるJSONデータへのアクセス
(XMLのStAXに相当) - ツリーモデルでのJSONデータへのアクセス
(XMLのDOMに相当) - JSONオブジェクトとJavaオブジェクトのバインディング
さらに、
ストリーミングAPIでJSONデータを読み込む
まずはストリーミングAPIを使ってJSONデータの読み込みを行ってみましょう。ストリーミングAPIは、
// JsonFactoryの生成
JsonFactory factory = new JsonFactory();
// JsonParserの取得
JsonParser parser = factory.createJsonParser(new File("sample.json"));
この例ではcreateJsonParser()メソッドに読み込み元となるJSONファイルのFileインスタンスを渡していますが、
作成したJsonParserに対してnextToken()メソッドを実行すると、
- START_
ARRAY - 配列の開始 ('[') - END_
ARRAY - 配列の終了 (']') - START_
OBJECT - オブジェクトの開始 ('{') - END_
OBJECT - オブジェクトの終了 ('}') - FIELD_
NAME - フィールド名 - VALUE_
EMBEDDED_ OBJECT - 組み込みオブジェクト形式の値 - VALUE_
FALSE - "false"値 - VALUE_
TRUE - "true"値 - VALUE_
NULL - nulla値 - VALUE_
NUMBER_ FLOAT - float型の値 - VALUE_
NUMBER_ INT - int型の値 - VALUE_
STRING - 文字列形式の値
たとえば、
[ { "name" : { "first" : "太郎", "last" : "技評" } } ]

現在位置のトークンのデータを取り出すためには、
以上を踏まえて、
[{
"name" : { "first" : "太郎", "last" : "技評" },
"mail" : "[email protected]",
"todo" : { "work" : "hogehoge", "limit" : "2012/02/13" }
},
{
"name" : { "first" : "次郎", "last" : "技術" },
"mail" : "[email protected]",
"todo" : { "work" : "hogehoge", "limit" : "2012/02/15" }
},
{
"name" : { "first" : "花子", "last" : "評論" },
"mail" : "[email protected]",
"todo" : { "work" : "hogepiyo", "limit" : "2012/02/28" }
}]
次のコードは、
// JsonFactoryの生成
JsonFactory factory = new JsonFactory();
// JsonParserの取得
JsonParser parser = factory.createJsonParser(new File("sample.json"));
// 配列の処理
if (parser.nextToken() == JsonToken.START_ARRAY) {
while (parser.nextToken() != JsonToken.END_ARRAY) {
// 各オブジェクトの処理
if (parser.getCurrentToken() == JsonToken.START_OBJECT) {
while (parser.nextToken() != JsonToken.END_OBJECT) {
String name = parser.getCurrentName();
parser.nextToken();
// "name"フィールド
if ("name".equals(name)) {
System.out.println(name + ": ");
while (parser.nextToken() != JsonToken.END_OBJECT) {
if (parser.getCurrentToken() == JsonToken.FIELD_NAME) {
System.out.print(" " + parser.getText() + ": ");
} else if (parser.getCurrentToken() == JsonToken.VALUE_STRING) {
System.out.println(parser.getText());
}
}
}
// "mail"フィールド
else if ("mail".equals(name)) {
System.out.println(name + ": " + parser.getText());
}
else {
parser.skipChildren();
}
}
}
else {
parser.skipChildren();
}
}
}
else {
parser.skipChildren();
}
配列の開始と終了、
このプログラムの出力結果は次のようになります。
name:
first: 太郎
last: 技評
mail: [email protected]
name:
first: 次郎
last: 技術
mail: [email protected]
name:
first: 花子
last: 評論
mail: [email protected]
ストリーミングAPIでJSONデータを作成する
続いて、
// JsonFactoryの生成
JsonFactory jsonFactory = new JsonFactory();
// JsonGeneratorの取得
JsonGenerator generator =
jsonFactory.createJsonGenerator(new File("output.json"), JsonEncoding.UTF8);
上記のようにした場合、
このJsonGeneratorオブジェクトに対して、
generator.writeStartObject();
generator.writeFieldName("first");
generator.writeString("太郎");
generator.writeFieldName("last");
generator.writeString("技評");
generator.writeEndObject();
writeStartObject()とwriteEndObject()はオブジェクトの開始と終了を、
最後に、
// 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", "[email protected]");
generator.writeEndObject();
// オブジェクトの書き込み
generator.writeStartObject();
generator.writeFieldName("name");
generator.writeStartObject();
generator.writeStringField("first", "次郎");
generator.writeStringField("last", "技術");
generator.writeEndObject();
generator.writeStringField("email", "[email protected]");
generator.writeEndObject();
// 配列の終わり
generator.writeEndArray();
// ファイルへの書き出し
generator.flush();
このコードによる出力例は次のようになります
[{
"name":{"first":"太郎","last":"技評"},
"email":"[email protected]"
},{
"name":{"first":"次郎","last":"技術"},
"email":"[email protected]"
}]
このように、