FlashにDBから検索した結果を表示させたり(その結果からさらに画像を表示させたり)したい場合、どういう形でデータのやり取りをすればいいのか、いつも悩む。
もはや異アプリ間のデータやりとりではデファクトとなっている(?)XMLが無難といえば無難だが、、いかんせん、面倒すぎる。
ActionScriptからXMLの処理ができなくもないが、データを取り出すためのハンドリングが面倒すぎ。
(ActionScript + XMLの例:ActionScript [5] : parse XML (1))
もっと簡単にやりたいと思い、色々調べる。
PHPにとって一番簡単なのは、Serialize()によるシリアル化されたデータ。
で、ActionScriptから使えるUnserializerがないかとググったら発見。
・・しかし、どうも配列が入れ子で、同名のKEYがある場合うまく動かない模様。
うーむ。コレが使えたら一番よかったんだけどなー。
次に、最近注目されているJSONを試す。PHP側には、
PEAR :: PEPr :: Details :: Services_JSON
を入れ、Flash側には、
JSON in ActionScript(Collection & Copy - JSON入門)
を利用。
これでうまくいったので、そのサンプルなど。まず、PHP側のソース
$data[] = array('code' => 'MS-06J','name' => 'ザクIIJ');
$data[] = array('code' => 'MS-09','name' => 'ドム');
$data[] = array('code' => 'MSM-04','name' => 'アッガイ');
$json = new Services_JSON();
echo 'flashVar=' . $json->encode($data);
?>
ちなみに、$dataをprint_rすると、
Array
(
[0] => Array
(
[code] => RX-78-2
[name] => ガンダム
)
[1] => Array
(
[code] => MS-06J
[name] => ザクIIJ
)
[2] => Array
(
[code] => MS-09
[name] => ドム
)
[3] => Array
(
[code] => MSM-04
[name] => アッガイ
)
)
となっている。JSON形式で出力されたデータは、
{"code":"MS-06J","name":"\u30b6\u30afIIJ"},
{"code":"MS-09","name":"\u30c9\u30e0"},
{"code":"MSM-04","name":"\u30a2\u30c3\u30ac\u30a4"}]
次に、Flash側のソース。1フレ目とかに買いとけばOK。
MyVars = new LoadVars ();
MyVars.load ("http://hostname/jsontest.php");
MyVars.onLoad = function (success:Boolean) {
if (success) {
mslist = JSON.parse(this.flashVar);
for(i=0;i<mslist.length;i++){
trace("code:" + mslist[i].code);
trace("name:" + mslist[i].name);
}
}
}
JSON形式でパースされれば、PHP側と同じ配列として扱える。すばらしく便利である。簡単なデータは全部これでOKじゃない?
ただ、あまりに巨大なデータは、parseに時間かかるので、ローディング処理とかをちゃんとやったほうがいいかも。
JSONのパーサはけっこういろんなスクリプトにもあるから、XML使う必要ないんじゃね?
注意点としては、PHPでJSONにする時、2バイトコードはUTF-8にしておかないと、文字化けします。
コメント (3)
JSON.asとflaファイルを同じフォルダに入れてコンパイルすると下記エラーがでてしまいます。
34:クラスは、外部 ActionScript 2.0 クラスのスクリプトでのみ定義される必要があります。
class JSON {
ActionScript エラー数 :1 報告済みエラー :1
いろいろ調べたのですが、どうしてもわからずコメントさせていただきました。
投稿者: 匿名 | 2007年06月24日 16:31
日時: 2007年06月24日 16:31
僕も同じエラーが出てどうしてもわからないんですが、
もしかしたらFlashのバージョンなのかもしれませんねぇ・・・。
ちなみに FLASH MX Professional 2004
Version 7.2 です。
投稿者: 匿名 | 2007年09月21日 12:38
日時: 2007年09月21日 12:38
解決しましたので再度コメントします。
#include "json.as"が不要でした。
これを取り除くだけでうまく動くと思います。
投稿者: 匿名 | 2007年09月21日 14:00
日時: 2007年09月21日 14:00