Запустите строковую функцию json - PullRequest
4 голосов
/ 22 октября 2010

У меня есть строка JSON, как это:

json = "{'run': 'function() { console.log('running...'); }'}"

Как мне запустить эту функцию внутри строки json?

Ответы [ 6 ]

7 голосов
/ 22 октября 2010

Вам нужно будет использовать функцию eval() ( doc ). У многих людей есть много чувств к этой функции. JSON лучше всего подходит для передачи данных, а не функций (см. JSON ). Функции должны лежать в сценарии на странице. Также есть синтаксическая ошибка в вашем размещенном коде (функция заключена в одинарные кавычки ('), как и первый параметр console.log). Но ...

json = "{\"run\":\"function() { console.log('running...'); }\"}"; //Fixed, thanks
obj = JSON.parse(json);
eval(obj.run); //Logs "running..."

Обновление:

О, и я ошибся. Eval, похоже, не любит анонимные функции. С исправленным кодом он будет анализировать json в объект со свойством run, равным String, со значением "function() { console.log('running...'); }". Но когда вы eval(obj.run);, вы получите ошибку SyntaxError, объявляющую неожиданное (. Предположительно, это (в функции ().

Итак, я могу придумать два способа справиться с этим:

  1. Удалите анонимную функцию из вашей фактической строки JSON (так, чтобы ваш PHP забыл о function () {), и оцените ее. Это означает, что он будет вызван, как только вы eval это.
  2. То, что я думаю, вы хотите, чтобы иметь возможность оценить его анонимной функцией, которая будет вызываться, когда вы хотите. Таким образом, вы могли бы написать функцию-обертку (вам также нужно будет выполнить опцию 1):

    function returnEval(str) {
        return function () { eval(str); }
    }
    

    Это позволит вам позвонить. Итак:

    obj = JSON.parse(json);
    obj.run = returnEval(obj.run);
    obj.run(); //Logs "running..."
    

Надеюсь, это поможет!

0 голосов
/ 10 марта 2016

Без использования eval('function()') вы можете создать новую функцию, используя new Function(strName).Приведенный ниже код был протестирован с использованием FF, Chrome, IE.

<html>
<body>
<button onclick="test()">Try it</button>
</body>
</html>
<script type="text/javascript">
  function test() {

    try {    

        var myJSONObject = {"success" : true, "jsFunc" : "myFunction()"};
        var fnName = myJSONObject.jsFunc;
        var fn = new Function(fnName);
        fn();

      } catch (err) {
        console.log("error:"+err.message);
      }

  }

  function myFunction() {
    console.log('Executing myFunction()');
  }
</script>
0 голосов
/ 12 октября 2014

Я знаю, что ветка старая, но я хочу поделиться с вами, ребята. Вы можете сделать строку json и легко разобрать ее с помощью этих функций.

function makeString(val){
    return JSON.stringify(val, function (key, value) {if (typeof value == 'function') {return value.toString();}return value;});
}

function parseIt(val){
    return JSON.parse(string, function (key, value) {if (value.toString().search("function")>-1) {eval("var func = " + value);return func;}return value;});
}
0 голосов
/ 16 сентября 2014

Попробуйте, это работает:

var JS = { "function" : "alert( new Date().getTime() );" };

new Function ( "", JS["function"] )();

для вложенных функций вы также можете использовать что-то вроде этого:

jQuery.each( JS, function( method, value ) {
        new Function ( "a, b", "if ( a == 'function' ) { new Function ( '', b )(); }" )( method, value );
} );
0 голосов
/ 22 октября 2010

Это работает для меня в Firefox:

var json = "{'run': 'function() { console.log(\\'running...\\'); }'}";
eval('var j = ' + json);
eval('var r = ' + j.run);
r();
0 голосов
/ 22 октября 2010

JSON на самом деле не предназначен для этого, но здесь кажется хорошим примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...