BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JSON用標準JavaAPI

JSON用標準JavaAPI

原文(投稿日:2013/04/26)へのリンク

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-b06org.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 プレゼンを見るのも良い。

この記事に星をつける

おすすめ度
スタイル

BT