July 31, 2007
Flashにjsonのデータを読ませたくて、json.asを使ってネットの情報を参考にして読んでみたが、Bad Stringであったり、謎のBad objectとかいうエラーが出てパース失敗しませんか?
あちこち見て、僕が調べた範囲でのやりかた、
1.json.asをincludeする。
2.PHPとかから、「json_var = {JSONのデータ文字列}」の形でアウトプットする。
3.LoadVarsオブジェクトのonLoadイベントで、this.json_varで取れた文字をjson.asでパースする
終わり
・
・
・
コレ文字列によっては失敗しません?
僕もFlash久々だったので、そのまま鵜呑みにしてハマりました。
調べるとネット上では、サーバサイドで文字列を事前に"とか&を数値参照に変換しないとダメよ、なども出てくるので変換した。
「あれーJSONって、文字をUTF-8にさえしておけば、そういうのを勝手にやってくれるから、そのままGETで送受信できるんじゃないのー?」
という疑問符を持ちながらも、ありがたく参考にさせてもらったが、やっぱり何かの文字でエラーが出てパースできない。
頑張ってデータを調べたら、この方法ではうまくいかないのは、文字列中にダブルクオート「”」が入った場合。
面倒だから、とサーバ側でダブルクオートをシングルクオートとかに変換しちゃえば動く。
でも、それ気持ち悪い。
ここでふと思いついた。ダブルクオートは、文字列の区切りとしてJSONでは重要な文字列。
LoadVarsというのは非常にリッチなクラス(正確にはLoadVariablesメソッド)で、URLのクエリストリングやPOSTヘッダに書かれた「a=b&c=d」を自動的にパースして、URLエンコードされた文字も自動的に元の文字列に戻してくれて、オブジェクトのプロパティに自動で設定してくれる便利なメソッド。
ということで、json.asでパースすべきJSONのデータもイイ感じにdecodeしてくれちゃってるからワケのわからないことになってるのでは?!という仮説を立てた。
ということで、
こたえ:
「LoadVarsオブジェクトのonDataイベントの引数を使ってパースすべし」
onDataイベントの引数には、LoadVarsがパースする前の生文字列を取得できるので、これをそのままjson.asに放り込みましょう。
以上。
そうすれば、きっとFlash専用の文字加工など不要になりますし、サーバ側で「json_var = {JSONのデータ文字列}」というFlashだけの特殊な出力をする必要が無くなります。
PHPなどのサーバサイドで事前に文字列を数値参照に変換しているのは二重encodeして結果的にonLoadの自動デコードでJSONとしての不適切な文字列に戻すのを避けるようにしてるためのもの??それだと無理矢理なおまじないではないかと。
しかし、文字列の区切りに使っているダブルクオートだけはそうはうまくいかないから、Bad objectというプリミティブなエラーが出るんだろうな。あまり深追いはしてないけど、僕のゴーストがそうささやいた。
JSONのパースをネタにblogを書いてる人は、パースに成功してみるところまではやってみたけど、それ以上は使っていないということなのだろうか、、、、それとも、ハマりにハマって直した情報をフィードバックしてくれていないだけなのだろうか。
onDataで取るの当たり前じゃんとかいう人がいたら、一言blogに書いてもらえるとありがたかった(ワガママ)
僕もまだ修行が足りないってことだが、json慣れしてるのにFlash慣れしてない開発者はきっと同じように困るだろうから、これが「JSON Bad Object」でgoogle上位に出るようにメモメモ
#とか偉そうなこと言って、全然的外れだったら是非、コメントで教えてください。