JSON Javascript到Flash通信问题(使用外部接口):硬编码字符串有效,否则不会



我在尝试向公司的flash播放器发送JSON命令时遇到了一个奇怪的问题。基本上,我无法传递播放列表到这个播放器-什么都没有发生-使用以下命令:

player.sendEvent("LOAD_PLAYLIST", json_str);

,但最奇怪的部分是,如果我使用Firebug的console.log打印整个命令,复制它并将其粘贴到代码中(因此硬编码播放列表),一切都像魔法一样工作。

例如:

player.sendEvent("LOAD_PLAYLIST", "{"streams": [{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname1/prog_1_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname2/prog_2_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname3/prog_3_20110804.mp4"}]}");

得到
console.log('[loadNewListofContents] playing the following content list: player.sendEvent("LOAD_PLAYLIST", ' + json_str.toString() + ');');

如果我硬编码它,它就能工作!我已经尝试了我能想到的所有toString()技巧(例如:json_str.toString(), '"' + json_str.toString() + '"'等…),但到目前为止还没有这样的运气。

任何想法?提前感谢!

如果您找不到使用JSON字符串的解决方案,也许您可以尝试发送一个对象—一个JavaScript对象,而不是对象的JSON表示—因为ExternalInterface会为您处理序列化。

换句话说,对象可以直接使用ExternalInterface在JavaScript和ActionScript之间发送,而不需要你自己做任何序列化和反序列化。

您发布的代码

player.sendEvent("LOAD_PLAYLIST", "{"streams": [{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname1/prog_1_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname2/prog_2_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname3/prog_3_20110804.mp4"}]}");

是一个使用""转义引号的字符串。AS3有已知的问题
只需将JavaScript对象直接传递给SWf。

// And in your AS3 code add this
if(ExternalInterface.available){
  ExternalInterface.addCallBack("AS3functiontocall", AS3functiontocall );
}
function AS3functiontocall( var obj:Object ):void{
     trace( obj.streams[0] ); // might have to eval or JSON.decode the obj
}

// JavaScriptcode should look something like 
function sendList( ){
  var container;
  if (navigator.appName.indexOf("Microsoft") >= 0){
    container = document;
  }else{
    container = window;
  }
  var obj = {
      "streams": [
                   {"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname1/prog_1_20110804.mp4"},
                   {"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname2/prog_2_20110804.mp4"},
                   {"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname3/prog_3_20110804.mp4"}
                 ]
  }
  var result = container["yourswfnamehere"].AS3functiontocall ( obj );
}

这段代码是未经测试的,但它应该给你一个想法

最新更新