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

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"が不要でした。
これを取り除くだけでうまく動くと思います。

コメントを投稿

2009年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 日々の記録: 本当に助かります。
bicycle on 文字化け: はじめまして、bic
dell on 日々の記録: 僕もヒートシンクの被
まる on 日々の記録: 昨日発生したのですが
通りすがり on spoolsv.exeがCPU 100%の対処法: 亀レスですが、 タス
on JavaScriptでクロスドメイン: こんなライブラリを見
ふりーどまん on 日々の記録: 私もSONYのVAI
ni-san on 日々の記録: このブログのおかげで
yan on thunderbirdを試す: ふたつの比較は同感で
teru on JavaScriptでクロスドメイン: 私もこの方式で実現し

アーカイブ