Ajaxを使わない場合でもJSONが便利なケースは多い。たとえば2つのプルダウンリストがあり、片方の選択内容に応じてもう片方の選択項目が変化する、というような場合だ。もちろんAjaxを利用して、片方の項目が変更されたタイミングでサーバから値を取得するという方法も考えられるが、データ量が少ない場合は最初からJavaScript内ですべての値を保持しておくほうが実装は容易だ。このようなケースでJSONを利用することができる。

図1 左側のプルダウンを選択すると右側のプルダウンの項目が変化する

ここではStrutsで利用する場合を考えてみよう。アクションでは以下のようにプルダウンリストで選択されうる値をJavaオブジェクトとして用意し、リクエストにsetAttribute()しておく。ここではMapを利用しているが、任意のJavaBeanを使用しても問題ない。

public class SampleAction extends Action {

  @Override public ActionForward execute(ActionMapping mapping, 
    ActionForm form, HttpServletRequest request, HttpServletResponse response) 
    throws Exception {

    Map products = new HashMap();
    products.put("OS", new String[]{"Windows XP", "Windows Vista", "MacOS X"});
    products.put("DB", new String[]{"PostgreSQL", "MySQL"});

    request.setAttribute("products", products);

    return mapping.findForward("success");
  }

}

JSPではセットされたJavaオブジェクトがJavaScriptの変数に代入されるようJSONに展開する。JSONICを利用することでJavaScriptの文字列リテラルのエスケープなど、面倒なことを考える必要は一切ない。

<%@ page contentType="text/html; charset=Windows-31J" %>
<%@ page import="net.arnx.jsonic.JSON" %>
<html>
  <head>
    <script type="text/javascript">
      // JSONデータを変数に代入
      var jsonData = <%= JSON.encode(request.getAttribute("products")) %>;
      ...

上記のJavaScriptの変数jsonDataは以下のように、JSONが展開され代入される(以下のコードは見やすいよう改行している)。

var jsonData = {
  "DB":[
    "PostgreSQL",
    "MySQL"
  ],
  "OS":[
    "Windows XP",
    "Windows Vista",
    "MacOS X"
  ]
};

この変数を利用して、プルダウンリストの選択変更時にもう片方のコンボボックスの選択項目を入れ替えるJavaScriptを作成すればよい。

まとめ - JSONICでJSONを活用しよう

本稿で紹介したように、JSONICはJava向けのJSONライブラリの中でも手軽に扱うことができるうえ、JSONのエンコード/デコードだけでなくJSONによる本格的なWebサービスフレームワークやDIコンテナとの連携までサポートしているなど機能も豊富だ。また、依存ライブラリがないため単一のJARファイルをクラスパスに追加するだけで使えるのも大きな魅力だ。JavaでJSONを扱う場合には是非候補に加えたい。

Ajaxを利用しないWebアプリケーションでもサーバサイドJavaからクライアントサイドのJavaScriptにデータを受け渡す手段としてJSONは十分に利用する価値があるし、JSONベースのWebサービスを呼び出すクライアントをJavaで実装する際にもJSONICが役立つことだろう。JavaアプリケーションでもぜひJSONICを利用してJSONを活用してほしい。