2010-11-22 29 views
2

Dans une extension côté serveur pour SmartFoxServer (qui utilise Rhino) J'ai eu un morceau de Javascript semblable à ceci:Rhino, typeof et autoboxing confusion

response["xpos"] = properties.get("xpos"); 
send(JSON.stringify(response)); 

Cela a provoqué des erreurs. Qu'est-il arrivé? Parce que les propriétés sont Java Map, lorsqu'un nombre est mis à l'intérieur, il est autooboxed dans un objet java.lang.Double. Par conséquent, lors de la récupération et de l'enregistrer dans response["xpos"], le résultat n'est pas un numéro JavaScript normal mais un JavaObject de type java.lang.Double. La fonction JSON.stringify n'était pas destinée à gérer cela et il s'est écrasé.

Je l'ai fixé avec un hack comme celui-ci:

response["xpos"] = 1.0 * properties.get("xpos"); 
send(JSON.stringify(response)); 

Y at-il une meilleure façon?

Répondre

1

Vous pouvez utiliser Number(properties.get("xpos")), comme dans la session de la console interactive suivante:

js> x=java.lang.Double(2) 
2.0 
js> typeof x 
object 
js> x instanceof java.lang.Double 
true 
js> y=Number(x) 
2 
js> typeof y 
number 

Voici comment les chaînes sont généralement converties dans Rhino de java.lang.String à des chaînes JavaScript natifs ainsi.