在AS3中解码JSON FlashVars

时间:2011-04-22 10:02:27

标签: actionscript-3 json flashvars

我正在努力通过FlashVars将JSON对象传递给.swf并解码AS3中的JSON FlashVars,并希望你能帮助我。

问题: 当我尝试解码FlashVars时,我得到JSONParseError: Unexpected o encountered

情况:

PHP函数从哈希创建图像路径并将它们放在这个JSON对象中:

[{"index":"0", "path":"image1", "ext":"jpg"},
{"index":"1", "path":"image2", "ext":"jpg"},
{"index":"2", "path":"image3", "ext":"jpg"}]

此JSON通过Flashvars传递给.swf。在HTML中我有这个:

<param name="FlashVars" value='[{"index":"0", "path":"image1", "ext":"jpg"},{"index":"1", "path":"image2", "ext":"jpg"},{"index":"2", "path":"image3", "ext":"jpg"}]'/>

PHP函数和.swf位于网站空间的同一文件夹中

然后我尝试使用此AS3代码解码main.as文件中的FlashVars(导入as3corelib):

var imagePaths:Object;    
try {

    var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
    trace(paramObj.toString());
    if(paramObj){
        imagePaths = JSON.decode(paramObj.toString());
    }
}
catch (error:Error)
        {
            trace(error.toString());
        }

“imagePaths”保存JSON对象,以便稍后可以构建图像的路径。据我所知JSON.decode返回一个当我在一个单独的txt文件中加载完全相同的JSON on localhost时,这个工作正常:

var imagePathLoader:URLLoader = URLLoader(e.target);
imagePaths = JSON.decode(imagePathLoader.data);

错误显然出现在try块中,因此我使用trace(paramObj.toString());跟踪paramObj变量并获取[object Object]作为输出。 在我看来,JSON解码函数试图解码字符串[object Object]而不是对象本身,因此在“对象”的第一个“o”处抛出错误?

我已经尝试过urlencode()来自PHP的JSON,然后作为FlashVars传递,这些建议在http://code.google.com/p/as3corelib/issues/detail?id=119上找到并且JSON.decode(paramObj);没有.toString()会抛出此错误:

  1118:价值的隐性强制   与静态类型对象可能   不相关的类型字符串。

那么,如何将JSON正确传递给.swf并将其在AS3中解码为对象?

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:4)

This page表明flashvars的正确用法是:

<PARAM NAME=FlashVars VALUE="varname=value">

在您的代码中

<param name="FlashVars" value='[{"index":"0", "path":"image1", "ext":"jpg"},{"index":"1", "path":"image2", "ext":"jpg"},{"index":"2", "path":"image3", "ext":"jpg"}]'/>

所以我猜它应该像

<param name="FlashVars" value='myvariable=[{"index":"0", "path":"image1", "ext":"jpg"},{"index":"1", "path":"image2", "ext":"jpg"},{"index":"2", "path":"image3", "ext":"jpg"}]'/>

然后在Flash代码中,您可以通过

来达到此目的
root.loaderInfo.parameters["myvariable"]

root.loaderInfo.parameters.myvariable

或者如果你喜欢这种方式

var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;

然后

paramObj["myvariable"]

paramObj.myvariable

答案 1 :(得分:1)

感谢您的回复。我昨天也发现了这个问题,但是8h(新用户......)无法回答我自己的问题。我做了什么: 在嵌入swf的HTML文件中:

<param name="FlashVars" value="var=urlencode([{"index":"0", "path":"image1", "ext":"jpg"},
{"index":"1", "path":"image2", "ext":"jpg"},
{"index":"2", "path":"image3", "ext":"jpg"}])"/>

然后在AS3代码中我访问了FlashVars:

var imagePaths:Object;    
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
var myFlashVar:String;
var varName:String;
for (varName in paramObj) {
    myFlashVar = String(paramObj[varName]);
}
imagePaths = JSON.decode(myFlashVar);

然后像往常一样处理JSON对象..谢谢你的帮助!