JSR-353、JSON処理(JSON-P)用のJava APIは、今月の最終承認投票にいたった。JSON-Pは(JAXPに似た)ストリーミングAPI(StAXのに似た)とオブジェクトモデルのAPI(DOMに似ている)で構成されている。リファレンス実装であるjsonpは、現在ベータでCDDL v1.1 と GPL v2の下でオープンソースした。JSON-Pは、今後のJava EE 7の一部となり、そのデフォルトのJSON実装のためにJAX-RSによって使用される。このAPIは、JSONデータバインディング(JAXBに似た)含んでおらず、より人気のあるJSONPすなわと"パディングのあるJSON"とは無関係ではあることに注意して欲しい。
JSON (JavaScript Object Notation) は軽量のデータ交換フォーマットで、Webアプリケーション、RESTサービス、NoSQLのデータベースで使用されている。JSONの人気と、Javaプラットフォーム(org.json、Jackson, google-gsonなど)用の多くのJSONライブラリの出現で、開発者がJSONを作成し、利用する方法標を準化する必要性が出てきた。JSON-Pは、近々の規格であり、スタンドアロンまたはJava EE 7のコンテナの一部として使用することができる。
JSON-Pは、2つのAPI、ストリーミングAPI(javax.json.stream)とオブジェクトモデルAPI(javax.json)に分かれる。ストリーミングAPIはJSONを解析して生成するための、低レベルな効率的な方法だ。それは2つの主要な抽象化、JsonParserとJsonGeneratorから構成されている。JsonParserは、プル・パーサーでフォワード可能であり、JSON入力ソースへの読み取り専用アクセスである。JsonGeneratorは、ストリームにJSONを書き込むためのメソッドを提供し、メソッドチェーンが可能である。。ジェネレータは、名前/値ペアをJSONオブジェクトに、そして値をJSON配列に書き込む。
以下がJsonParser と JsonGeneratorのコード例であり、最初は、我々が読んだり、作成するJSONデータである。
[ { "type" : "home", "number" : "(800) 111-1111" }, { "type" : "cell", "number" : "(800) 222-2222" } ]
以下がJsonParser の例で、最後が出力結果である。
JsonParserFactory factory = Json.createParserFactory(null); JsonParser parser = factory.createParser(new StringReader(json)); while (parser.hasNext()) { Event event = parser.next(); switch (event) { case KEY_NAME: { System.out.print(parser.getString() + "="); break; } case VALUE_STRING: { System.out.println(parser.getString()); break; } } } type=home number=(800) 111-1111 type=cell number=(800) 222-2222
以下が我々のJsonGenerator 例で、JSON を System.outに書き出している。
JsonGeneratorFactory factory = Json.createGeneratorFactory(null); JsonGenerator generator = factory.createGenerator(System.out); generator.writeStartArray(). writeStartObject(). write("type", "home"). write("number", "(800) 111-1111").writeEnd(). writeStartObject(). write("type", "cell"). write("number", "(800) 222-2222").writeEnd(). writeEnd().close();
次は、オブジェクトモデルのAPIで、これは単純で使いやすい、高レベルのAPIで、ストリーミングAPIの上に実装されている。これは、メモリ内にJSONデータを表す、ツリー状の構造体を作成し、簡単にナビゲートし、クエリすることができる。オブジェクトモデルAPIの主要な抽象化は、JsonObjectとJsonArrayで両方共不変である。JsonObjectは、モデルから名前/値ペアの順序付けのないコレクションにアクセスできるMapビューを提供する。JsonArrayは、順序付けられた値のシーケンスにアクセスするためのListビューを提供する。これらのオブジェクトモデルを作成するには、ビルダーパターン(JsonObjectBuilderとJsonArrayBuilder)を使用するか、またはJsonReaderを使用して入力ソース(InputStreamまたはReader)からそれらを読むことができる。それからJsonWriterを使用して、出力ソース(OutputStreamまたはWriter)にこれらのオブジェクトモデルを書くことができる。
以下がJsonArrayBuilderを使って、JsonArrayを作成した例である。再び、我々は上記のJSON データを操作している。
JsonBuilderFactory factory = Json.createBuilderFactory(null); JsonArray jsonArray = factory.createArrayBuilder() .add(factory.createObjectBuilder(). add("type", "home"). add("number", "(800) 111-1111")) .add(factory.createObjectBuilder(). add("type", "cell"). add("number", "(800) 222-2222")).build();
以下がJsonReader用の例である。
try (JsonReader jsonReader = Json.createReader(new StringReader(json))) { JsonArray array = jsonReader.readArray(); System.out.println(array); }
以下がJsonWriterの例である。
try (JsonWriter jsonWriter = Json.createWriter(System.out)) { jsonWriter.writeArray(jsonArray); }
ベータリリースを試すには、jsonpをダウンロードかjavax.json:javax.json-api:1.0-b06 とorg.glassfish:javax.json:1.0-b06のMaven 成果物を使うことができる。Java SE 6 かそれ以上が必要である。詳細については、公式のJava API for JSON Processing ウェブサイトに行き、JSON Processing Javadocsを読むことである。またYouTubeにあるJavaOneにおけるJava API for JSON Processing プレゼンを見るのも良い。