У меня есть JSON строку, как это:Запуск функции JSON строку
json = "{'run': 'function() { console.log('running...'); }'}"
Как запускать эту функцию внутри строки JSON?
У меня есть JSON строку, как это:Запуск функции JSON строку
json = "{'run': 'function() { console.log('running...'); }'}"
Как запускать эту функцию внутри строки JSON?
Вы должны использовать функцию eval()
(doc). У многих людей есть много чувств по поводу этой функции. JSON лучше всего подходит для транспортировки данных, а не функций (см. JSON). Функции должны находиться в скрипте на странице. Также есть синтаксическая ошибка в вашем опубликованном коде (функция обернута в одинарные кавычки ('), а также первый параметр console.log). Но ...
json = "{\"run\":\"function() { console.log('running...'); }\"}"; //Fixed, thanks
obj = JSON.parse(json);
eval(obj.run); //Logs "running..."
Update:
О, и я ошибся. Eval, похоже, не любит анонимные функции. С измененным кодом он будет разбирать json в объект с свойством run, который является String
, со значением "function() { console.log('running...'); }"
. . Но когда вы eval(obj.run);
, вы получите SyntaxError объявляющего неожиданный (По-видимому, это (в функции ()
Итак, я могу думать о двух способах борьбы с этим:.
function() {
) и Eval его. Это означает, что она будет называться как только вы eval
его.то, что я думаю, что вы хотите, это быть в состоянии оценить его анонимной функции, которая будет вызываться, когда вы хотите. Итак, вы могли бы написать функцию-обертку (вам нужно будет следовать вариант 1 для этого, а):
function returnEval(str) {
return function() { eval(str); }
}
Это позволит вам назвать. Итак:
obj = JSON.parse(json);
obj.run = returnEval(obj.run);
obj.run(); //Logs "running..."
Надеется, что это помогает!
Это работает для меня в Firefox:
var json = "{'run': 'function() { console.log(\\'running...\\'); }'}";
eval('var j = ' + json);
eval('var r = ' + j.run);
r();
Попробуйте, это работает:
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);
});
I знаю, что поток старый, но я хочу поделиться с вами, ребята. Вы можете сделать строку 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;});
}
Без использования 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>
'eval (json.substring (10, json.length-2))();'? =) – Claudiu