かんばん@WebでXMLのデータ受け渡しが気に食わない。
php側(サーバ)でテキストデータを読み込んでXML形式に変換、
JavaScript(クライアント)でXMLをパースしてデータを取得する。
通信の為だけにXMLを利用しているし、変換処理が無駄っぽい。
これを解決するのがJSONだが、今さらJSONにするのもなーと思っていましたが
やっぱ他でも使いそうなので勉強がてらに簡単なサンプルを作成してみました。。
まずはPHP側でJSON形式にエンコードしないといけないのですが、
JSONを利用する為に環境まで準備するのはちょっとやだ。
aaa.livedoor.jpにインストールする事もできないし。
なのでPHPで作成したJSONモジュールPEAR::Services_JSONを使うことにする。
ライセンスはBSDなのでたぶん大丈夫。
Services_JSON
http://pear.php.net/pepr/pepr-proposal-show.php?id=198
ほんとはJsphonを使いたかったのですが
エラー処理にPEAR_ErrorStackを使っている為、PEARが入っていないaaa.livedoor.jpでは利用できなかった。
逆にPEARのServices_JSONが単体で利用できるのがちょっとヒニク・・・
使い方は非常に簡単。
インスタンス化してencodeメソッドを呼ぶだけ。
あと、Cntent-typeは下記を参照に設定。
JSONとContent-Type
http://blog.nomadscafe.jp/archives/000578.html
サーバ側:PHP
require_once("./JSON/JSON.php"); $test = array(); $test["a"] = "abc"; $test["b"] = array(2, -3, 500.123, 1000000000000); $test["c"] = array("key1" => "value", "key2" => "ばりゅう"); header ("Content-type: text/javascript+json; charset=UTF-8"); $json = new Services_JSON(); echo $json->encode($test);
結果はこんな感じで返ってきます。
{"a":"abc","b":[2,-3,500.123,1E+012],"c":{"key1":"value","key2":"u3070u308au3085u3046"}}
※レイアウトが崩れる為、意図的に改行しています。
次にクライアント。一度prototype.jsで実装したのですが
ここもちょっと新しいことしたくて話題のMochiKit。
MochiKit
http://mochikit.com/
クライアント側:JavaScript
function send() { var url = "./php/test_json.php"; var deferred = loadJSONDoc(url); deferred.addCallback(callBackFunc); } function callBackFunc(obj) { var html = ""; html += decoration("a", obj.a); html += decoration("b", obj.b.join(" | ")); html += decoration("c", obj.c.key1+","+obj.c.key2); var element = document.getElementById("disp"); element.innerHTML = html; } function decoration(key, value) { return "<p>"+key+":<b>"+value+"</b></p>"; }
これでOK
できたのはココです。
http://f56.aaa.livedoor.jp/~tdnr/lab/json_mochikit/
まだガッツリしたのは組んでないのでアレなんですが、XMLでの受け渡しよりは
楽になる予感が(非常に)します。なのでVer1.0に向けてJSONに作り直すでしょう。
MochiKitはちょっと保留。これだけではprototype.jsと比較するのは困難。
よってクライアント側を作り直すとしてもjsライブラリを変えるかどうかは保留。
どっかでjQueryも評価しないとなー。
参考サイト
Collection & Copy – JSON入門
http://d.hatena.ne.jp/brazil/20050915/1126709945
ふつうのMochiKitプログラミング
http://tokyoenvious.xrea.jp/javascript/Shibuya.js/tt2.html