Rhino, typeof et autoboxing confusion
-
27-09-2019 - |
Question
Dans une extension côté serveur pour SmartFoxServer (qui utilise Rhino) J'ai eu un morceau de Javascript semblable à ceci:
response["xpos"] = properties.get("xpos");
send(JSON.stringify(response));
erreurs causées. Qu'est-il arrivé? Parce que les propriétés est un Map
Java, lorsqu'un numéro est mis, il est autoboxed dans un objet java.lang.Double
. Par conséquent, lors de la récupération et le stockage dans response["xpos"]
, le résultat est un nombre régulier Javascript mais un JavaObject
de type java.lang.Double
. La fonction JSON.stringify
n'a pas été conçu pour gérer cela et il est écrasé.
Je l'ai fixé avec un hack comme ceci:
response["xpos"] = 1.0 * properties.get("xpos");
send(JSON.stringify(response));
Y at-il une meilleure façon?
La solution
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.