prototype.jsクックブック03 Hello Json!!

というわけで、Perl(CGI) + prototype.jsでのJsonデータの使い方を説明します。まず、Jsonってなに? って人は下記サイトあたりが参考になるかもしれない。

http://d.hatena.ne.jp/brazil/20050915/1126709945

とりあえず、デモを用意したので、ご覧ください。

http://ya-lab.main.jp/prototype-js-cookbook/03_hello_json/demo.html

ここでやってることは簡単。demo.htmlから非同期でreturns_json.cgiにアクセス。帰ってきた値を評価*1してalertで表示しているだけ。では、まずはdemo.htmlから。

<html><head>
  <title>prototype.js Cookbook 03: hello json!"</title>
  <script type="text/javascript" src="prototype.js"></script>
  <script type="text/javascript">
		
    // 非同期でJSONデータを取得する。
    function get_json_text() {
      var params = '';
      var url = 'returns_json.cgi'; 
			
      new Ajax.Request (
        url,
        {
          method: 'POST',
          parameters: params,
          onComplete: showResponse
        }
      );
    }
		
    // 帰ってきたJSONデータをevalして表示する。
    function showResponse(req, json) {
      eval("var ret = " + req.responseText);
      alert(ret.name + "("+ret.age+") : " + ret.email);
    }
  </script>
</head>
<body>

<a href="#" onclick="get_json_text(); return false;">get Json with Ajax</a>

</body>
</html>

新しいのはshowResponseのなかのevalぐらいかな? これを見て「あれ、引数にjsonってのがあるけど、何?」って思った人は鋭い。実は今回は引数のjsonは使わない事にした。詳細はまた後日説明するかもしれないが、簡単に言うとCGI側がbody部分にJson形式データを書き出すときは今回のようにevalする。そうでなくて、レスポンスのヘッダにX-JSON: ({ ... Json Formatted Data ... })という形式でデータを送る場合は引数のjsonをそのまま利用出来るわけ。

#!/usr/bin/perl -w

use strict;
use CGI;

my $cgi = CGI->new();

my $json_txt = << "__EOL__";
(
  {
    "name": "Mr. ME",
    "age": "23",
    "email": "Mr-me at email.com"
  }
)
__EOL__

print $cgi->header(-content_type => "text/javascript",
			       -charset => "utf-8");f
print $json_txt;

ここでは静的にJSON形式のデータを表示しているだけ。簡単ですね。

*1:evalするってこと