9
votes

Comment convertir une chaîne JSON en une fonction de JavaScript?

Comment puis-je convertir une chaîne en javascript / jQuery en une fonction?

J'essaie d'utiliser une liste de paramètres JSON pour initialiser une fonction. Cependant, l'un des paramètres est une fonction que je stocke comme une chaîne, et je reçois une erreur lorsque j'essaie d'utiliser Eval () pour renvoyer la fonction.

Par exemple, si mon JSON est: xxx

puis dans mon code: xxx


1 commentaires

Merci - je sais que JSON est uniquement des données uniquement ... J'essaie d'initialiser l'objet JQGrid avec une liste de paramètres à changement, et j'utilise occasionnellement un paramètre prend une fonction ... et dans ce cas, comme la fonction elle-même a changé Données internes, il est plus facile de le générer et d'envoyer une chaîne, puis de la définir dans ma bibliothèque et de l'initialiser séparément.


6 Réponses :


1
votes

À la recherche d'un moyen de NON UTILISER EVAL CODE> STROND> C'est le meilleur que je puisse trouver. Utilisez le constructeur de fonction pour créer une fonction code> à partir d'une chaîne code>.

var parsed = JSON.parse('{"one":"700", "two":"function(){return 0;}" }');
var func = new Function('return ' + parsed.two)(); // return parsed.two function
alert(typeof func); // function
alert(func()) // 0


2 commentaires

Je pense que vous voulez supprimer le commentaire :)


L'objet JSON n'existe pas dans tous les navigateurs. C'est-à-dire 7 ou plus tôt ne l'avez pas



0
votes

voir cette question à la question . Comme cela a été dit, Json est censé contenir des données. Pour traiter une pièce des données en fonction, vous devez d'abord évaluer la chaîne.


0 commentaires

0
votes

Vous êtes évalué une fonction anonyme, ce qui ne sera bien sûr pas appelé par rien. Si vous vouliez vraiment exécuter le code dans le JSON, le texte devrait être alerte (e) .

Cependant, cela ne sonne pas comme une chose très sensible à faire. Vous seriez meilleur de l'écriture de code pour gérer le contenu de l'objet JSON, plutôt que d'essayer de gérer le code intégré dans le JSON.


0 commentaires

0
votes

Nith Toi Nith Toi est particulièrement agréable, mais si vous pouvez vous débarrasser de la fonction (E) des bits de wrapper, vous pouvez utiliser var mydynamicfunction = nouvelle fonction ("E" "," Alerte (E); "); Sinon, vous envisagez d'utiliser eval () . EVAL () est diabolique en général. Si c'est JSON que vous revenez d'un $. Getjson appel ou quelque chose, vous vous ouvrez aux problèmes de sécurité.


0 commentaires

7
votes

3 commentaires

Merci - fonctionne bien. Je récupère le Json de JQuery's $ (). Getjson (), qui analyse sans eval.


Merci - ça marche génial. J'ai souvent entendu dire que cet eval est mauvais - mais je ne sais pas vraiment pourquoi. JSON.PARSE () et JQuery's $ .parsejson () Ne semblent pas évaluer la fonction - il semble donc que je dois utiliser eval (). Toutefois, si quelqu'un voulait abuser de cela, ils devraient connaître le paramètre spécifique, car JQuery renvoie un objet analysé à partir d'un appel $ .gejson ().


@Adam: Si vous savez que vous avez un contrôle absolu sur le contenu étant évalué, vous allez bien. C'est juste qu'il exécute une représentation de chaîne de JavaScript que vous le donnez, alors s'il est possible que quelqu'un puisse passer du code malveillant, il ne faut pas être utilisé.



1
votes

Utilisez ceci:

parameters = eval('(' + json + ')');
$('#myDiv').addThisFeature({
 parameter_1: parameters.one,
 parameter_2: eval('(' + parameters.two + ')')  // <= does not generate an error
});


1 commentaires

Merci - vient de voir ceci ... C'est beaucoup plus propre que de définir une variable séparée pour la fonction.