То, что вы получили в этих образцах данных, вы разместили , а не JSON. В строгом JSON значение свойства может быть
- строка
- число
- логическое
true
или false
null
- массив
- объект
Нет способа включить определение функции в JSON. (Ну, это не совсем так; вы можете использовать строки, числа, массивы, объекты и т. Д. Для описания функции таким образом, что ваш код может восстановить ее после анализа JSON. Дело в том, что прямые выражения функций JavaScript запрещены.)
Одна простая, слегка мешающая вещь, которую вы можете сделать, это сохранить тело функции в виде строки, а затем восстановить ее, вызвав
foo.fn = new Function(foo.fn);
после завершения анализа JSON.
редактировать подробнее:
Конструктор «Function ()» принимает в качестве аргументов список строк, представляющих имена аргументов, за которыми следует строка, которая будет использоваться в качестве тела функции. Если вы хотите закодировать полную функцию JavaScript, вы можете захотеть, чтобы она выглядела как объект:
{
'foo': 'plain property',
'someFunction': {
'arguments': [ 'x', 'y' ],
'body': 'if (x > y) return "x"; return "y";'
}
}
Теперь, чтобы превратить someFunction в real функцию, вы должны использовать что-то вроде этого:
function reconstructFunction(descr) {
var params = (descr.arguments || []).slice(0);
params.push(descr.body);
return Function.apply(null, params);
}
Затем вы можете просто передать дескриптор функции из вашего JSON во что-то в этом роде, и тогда у вас будет истинная функция JavaScript для вызова.