garbagetown

個人の日記です

Java で JSON

先日のブログにて紹介したとおり、Open Flash Chart 2 はデータ形式に JSON を採用しています。
例えば、Open Flash Chart 2 の チュートリアル では、以下のような JSON を使ってグラフを描画する例が紹介されています。

{
  (略)
  "elements":[
    {
      "type":     "bar",
      "alpha":     0.5,
      "colour":    "#9933CC",
      "text":      "Page views",
      "font-size": 10,
      "values":    [9,6,7,9,5,7,6,9,7]
    },
    {
      "type":      "bar",
      "alpha":     0.5,
      "colour":    "#CC9933",
      "text":      "Page views 2",
      "font-size": 10,
      "values":    [6,7,9,5,7,6,9,7,3]
    }
  ],
  (略)
}

角括弧で囲まれている部分は配列、中括弧で囲まれている部分はハッシュを表し、これらは入れ子にすることもできるので、上記の例の場合、一番外側のハッシュの中に elements というキーのハッシュがあって、その要素は配列で、その配列の各要素はまたハッシュで、そのハッシュの中に values というキーの配列があって、その配列の各要素は 9,6,7,9,5,7,6,9,7 である、と言うことになります。
なに言ってるか分かりませんよね。分からなくても生活に支障は無いので気にしないでください。
で、これをバカ正直に Java で書こうとすると、以下のようになります。

Map<String, Object> elem1 = new HashMap<String, Object>();
elem1.put("type", "bar");
elem1.put("alpha", 0.5);
elem1.put("colour", "#9933CC");
elem1.put("text", "Page views");
elem1.put("font-size", 10);
elem1.put("values", new int[]{ 9,6,7,9,5,7,6,9,7 });

Map<String, Object> elem2 = new HashMap<String, Object>();
elem2.put("type", "bar");
elem2.put("alpha", 0.5);
elem2.put("colour", "#CC9933");
elem2.put("text", "Page views 2");
elem2.put("font-size", 10);
elem2.put("values", new int[]{ 6,7,9,5,7,6,9,7,3 });

List<Map<String, Object>> elements = new ArrayList<Map<String, Object>>();
elements.add(elem1);
elements.add(elem2);

Map<String, Object> outer = new HashMap<String, Object>();
outer.put("elements", elements);

ぼくが生来の怠け者である点は否定しませんし、きちんとクラスを作ってリフレクションを駆使すればもっとすっきりするのは分かっていますが、やっぱりこれは少々しんどいです。
世間でブーブー言われているほど Java は悪くないと思いますが、コレクションをこねくり回す際の手軽さという点では、どうしても PerlRuby に軍配が上がりそうです。