« 初めての編み物〜デスキャ別〜 | メイン | ヒビノキロク »

PHPからJSONでFlashにデータを渡す

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側のソース

<?php

include 'JSON.php';

$data = array();
$data[] = array('code' =>
 'RX-78-2','name' => 'ガンダム');
$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);

?>
※ソースはUTF-8で保存)
ちなみに、$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形式で出力されたデータは、
flashVar=[{"code":"RX-78-2","name":"\u30ac\u30f3\u30c0\u30e0"},
{"code":"MS-06J","name":"\u30b6\u30afIIJ"},
{"code":"MS-09","name":"\u30c9\u30e0"},
{"code":"MSM-04","name":"\u30a2\u30c3\u30ac\u30a4"}]
となる。
次に、Flash側のソース。1フレ目とかに買いとけばOK。
#include "json.as"

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);
    }
  }
}
load()の所に、呼び出すphpを書く。(要するにJSON形式のもの。テキストファイルでも可)

JSON形式でパースされれば、PHP側と同じ配列として扱える。すばらしく便利である。簡単なデータは全部これでOKじゃない?

ただ、あまりに巨大なデータは、parseに時間かかるので、ローディング処理とかをちゃんとやったほうがいいかも。

JSONのパーサはけっこういろんなスクリプトにもあるから、XML使う必要ないんじゃね?

注意点としては、PHPでJSONにする時、2バイトコードはUTF-8にしておかないと、文字化けします。

トラックバック

このエントリーのトラックバックURL:
http://www.ironhearts.com/diary/mt-tb-ih.cgi/644

コメント (3)

Anonymous:

JSON.asとflaファイルを同じフォルダに入れてコンパイルすると下記エラーがでてしまいます。

34:クラスは、外部 ActionScript 2.0 クラスのスクリプトでのみ定義される必要があります。
class JSON {

ActionScript エラー数 :1 報告済みエラー :1

いろいろ調べたのですが、どうしてもわからずコメントさせていただきました。

Anonymous:

僕も同じエラーが出てどうしてもわからないんですが、
もしかしたらFlashのバージョンなのかもしれませんねぇ・・・。
ちなみに FLASH MX Professional 2004
Version 7.2 です。

Anonymous:

解決しましたので再度コメントします。
#include "json.as"が不要でした。
これを取り除くだけでうまく動くと思います。

コメントを投稿

2008年07月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

最近のコメント

う〜ん・・・ on 素朴な疑問: にょうをした、きたな
困ってました on ATOKとIME2005が勝手に切り替わる問題: 何故か勝手に切り替わ
go on 日々の記録: 4600C、同じ症状
Masatoru on 日々の記録: このサイトのおかげで
yy on 日々の記録: はじめまして。 昨日
ひろまま on 日々の記録: はじめまして。 私も
いきあん on 日々の記録: ANN様・皆様 46
ゅーーーーヵ on 目がテン/ドッヂボール: とれるように、なりま
通行人 on ATOK17の省入力候補を削除する方法: 省入力候補削除方法を
taka on 日々の記録: 4600Cを使ってい

アーカイブ