こんにちは、さいきんJSON形式のデータの存在を知りましたkijimaです。
XMLでやりとりするより軽いみたいですね、JSON。

案件でJSONデータをFlashVars経由でFlash内に渡すところでつまずいたので備忘録としてエントリーします。具体的な内容は、AS3でFlashVarsを取得する場合はAS2と同じようにはいかない点と、JSONデータをFlash上で扱う場合の注意点の二つになります。


FlashVarsなので、JSONデータ形式のまま直接swfに渡すことはできません。「いや、なんとかしてJSONデータのまま渡せないものか…」と小一時間悩みましたが、FlashVarsで渡したパラメータは、たとえ数字であってもString型になるようです。

JSONデータをそのまま渡せないとなると、いったんstring変数でFlash内に入れてから、そこから再びJSONデータとして扱えるようにする必要が出てきます。


そこで、Google CodeにアップされているAS3の機能拡張ライブラリ「as3corelib」の中のJSONクラスを使います。

as3corelibをGoogle Codeからゲットしてきてクラスパスを通します。
as3corelib - Google Code


実際のコードはこんな感じになりました。

HTMLにはswfObjectでこんな記述をして、FlashVarsで「json」という名前の値をFlash側に渡します。

so.addVariable( 'json','[{"date":"2008-10-07","param":"0"},{"date":"2008-10-08","param":"10"},{"date":"2008-10-09","param":"20"}]' );


as側の記述はこんな感じになりました。jsonを配列に入れてtraceするところまでになります。

package { import com.adobe.serialization.json.JSON; import flash.display.MovieClip; public class parseJSON extends MovieClip{ var flashVars:Object; var dateArray:Array = new Array(); var paramArray:Array = new Array(); public function parseJSON() { //AS3でFlashVarsを扱う場合、AS2のようにそのまま変数には入らず、 //MovieClipインスタンスのloaderInfo.parametersに格納されます。 flashVars = loaderInfo.parameters; //補足:実際には下記のようなデータが入ってきます。 //flashVars.json = '[{"date":"2008-10-07","param":"0"},{"date":"2008-10-08","param":"10"},{"date":"2008-10-09","param":"20"}]'; var obj:Object = JSON.decode(flashVars.json); for(var j in obj){ dateArray.push(obj[j]["date"]);//dateの値を配列に代入 paramArray.push(obj[j]["param"]);//paramの値を配列に代入 } trace(dateArray);//出力結果 -> 2008-10-07,2008-10-08,2008-10-09 trace(paramArray);//出力結果 -> 0,10,20 } } }

HTML5飯