2011-04-22 4 views
2

Je suis aux prises avec le fait de passer un objet JSON à un fichier .swf via FlashVars et de décoder le JSON FlashVars dans AS3 et j'espérais que vous pourriez m'aider.Decode JSON FlashVars dans AS3

Problème: Je reçois un JSONParseError: Unexpected o encountered lorsque j'essaie de décoder les FlashVars.

Situation:

Une fonction PHP crée des chemins vers des images à partir d'un hachage et les met ensemble dans cet objet JSON:

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

Ce JSON est passé à .SWF via Flashvars. Dans le HTML, j'ai ceci:

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

La fonction PHP et le .swf sont dans le même dossier sur l'espace Web

Ensuite, j'essaie de décoder les FlashVars dans mes main.as fichier avec ce code AS3 (as3corelib est importée):

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" contient l'objet JSON plus tard les chemins vers les images pourraient être construites. Pour autant que je compris JSON.decode retourne un Cela a bien fonctionné quand je chargé exactement le même JSON sur localhost à partir d'un fichier txt séparé avec:

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

L'erreur se produit évidemment dans le bloc d'essai, alors je retracé l'paramObj variable avec trace(paramObj.toString()); et obtenir [object Object] en sortie. Il me semble que la fonction de décodage JSON essaie de décoder la chaîne [object Object] plutôt que l'objet lui-même et renvoie donc une erreur au premier "o" de "objet"?

Je l'ai déjà essayé de urlencode() le JSON de PHP avant de passer en FlashVars, les suggestions trouvées sur http://code.google.com/p/as3corelib/issues/detail?id=119 et fait JSON.decode(paramObj); sans .toString() qui jette cette erreur:

1118: Implicit coercion of a value with static type Object to a possibly unrelated type String.

Alors, comment puis-je passer le JSON correctement au fichier .swf et le décoder dans AS3 à un objet?

Merci à l'avance pour toute aide

+0

Avez-vous essayé JSON.encode() à la place? Decode tente d'analyser une chaîne au format JSON dans un objet. Encode transforme un objet ActionScript en une chaîne au format JSON. – scriptocalypse

Répondre

1

Merci pour les réponses .. Je l'ai également trouvé hier mais je n'ai pas pu répondre à ma propre question pendant 8h (nouvel utilisateur ..). Ce que je l'ai fait: Dans le fichier HTML qui intègre le swf:

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

puis dans le code AS3 J'Accession à la FlashVars avec:

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); 

alors traité l'objet JSON comme pour usual..thanks ton aide!

+0

cela ne fonctionnera pas à savoir –

+0

ne peut pas dire si c'est le cas, mais au moment de la question et maintenant encore plus je ne me soucie pas de support IE .. – hajn

4

This page montre que l'utilisation correcte de flashvars est:

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

Dans votre code, vous avez

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

Je suppose que ce doit être quelque chose comme

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

puis dans le code flash que vous pouvez atteindre ce par

root.loaderInfo.parameters["myvariable"] 

ou

root.loaderInfo.parameters.myvariable

ou si vous préférez cette façon

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

puis

paramObj["myvariable"] 

ou

paramObj.myvariable.