Как мне преобразовать строку JSON в функцию в JavaScript? - PullRequest
7 голосов
/ 14 декабря 2010

Как я могу преобразовать строку в javascript / jquery в функцию?

Я пытаюсь использовать список параметров JSON для инициализации функции. Однако одним из параметров является функция, которую я сохраняю в виде строки, и я получаю сообщение об ошибке, когда пытаюсь использовать eval () для возврата функции.

Например, если мой JSON:

json = { "one": 700, "two": "function(e){alert(e);}" }

Тогда в моем коде:

parameters = eval(json);
$('myDiv').addThisFeature({
 parameter_1: json.one,
 parameter_2: eval(json.two)  // <= generates error
})

Ответы [ 6 ]

7 голосов
/ 14 декабря 2010

Пример: http://jsfiddle.net/patrick_dw/vs83H/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }';
var parameters = JSON.parse( json );
eval( 'var func = ' + parameters.two );
func( 'test' ); // alerts "test"

Вам необходимо загрузить библиотеку JSON в браузерах, которые ее не поддерживают.

Или сделать дваотдельные уловки:

Пример: http://jsfiddle.net/patrick_dw/vs83H/1/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }';
eval( 'var parameters = ' + json );
eval( 'var func = ' + parameters.two );
func( 'test' );

Я полагаю, вы знаете об опасностях Eval.

1 голос
/ 14 декабря 2010

Используйте это:

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

Добавление скобок в начало и конец строки предотвращает синтаксическую ошибку.

Обратите внимание, однако, что вы анализируете JSON, используя eval(что в некоторых случаях имеет угрозу безопасности, но я предполагаю, что это не имеет значения, потому что вы действительно хотите запустить произвольный код, отправленный сервером).Если у вас есть гибкость на стороне сервера (для отправки недопустимого JSON), вы можете просто отправить функцию , а не в кавычках в виде строки, и eval должна быть в состоянии разобрать это просто отлично.

0 голосов
/ 14 декабря 2010

Ни один из способов не особенно хорош, но если вы можете избавиться от битов обёртки функции (e), тогда вы можете использовать var myDynamicFunction = new Function("e", "alert(e);"); В противном случае вы смотрите на eval().Eval() это вообще зло.Если это JSON, который вы получаете после вызова $.getJSON или чего-то еще, вы открываете себя для проблем безопасности.

0 голосов
/ 14 декабря 2010

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

Однако это не очень разумно. Вам лучше было бы писать код для работы с содержимым объекта json, а не пытаться запускать код, встроенный в json.

0 голосов
/ 14 декабря 2010

См. этот ТАК вопрос .Как было сказано, JSON предназначен для хранения данных.Чтобы обработать часть данных как функцию, сначала нужно проверить строку.

0 голосов
/ 14 декабря 2010

В поисках способа не использовать eval это лучшее, что я мог придумать.Используйте конструктор Function для создания function из string.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...