В части ответа JSON веб-сайта было это (... добавлено для контекста):
{..., now:function(){return(new Date).getTime()}, ...}
Допустимо ли добавление анонимных функций в JSON? Я ожидаю, что каждый раз, когда вы обращаетесь к «времени», вы получите другое значение.
json
anonymous-function
Закари Скотт
источник
источник
JSON.parse('{now:function(){return(new Date).getTime()}')
. Инспектор говорит:Uncaught SyntaxError: Unexpected token n
беглый взгляд на спецификацию JSON подтверждает это. Сосредоточьтесь на разделе «ценность».Ответы:
Нет.
JSON предназначен исключительно для использования в качестве языка описания данных. Как отмечено на http://www.json.org , это «облегченный формат обмена данными». - не язык программирования.
Согласно http://en.wikipedia.org/wiki/JSON , поддерживаются следующие "основные типы":
null
источник
a==null?1:a.toString()==""
что он делает, это говорит, что если a = null, то он возвращает 1 / true, если это "" означает пустую строку, вы также получаете 1 / true .. если это не null или "", тогда он вернет 0 / false, вы можете реплицировать это больше для работы с [] и {} просто просто добавляя?1:a==[]?1:a.toString()=={}.toString();
в мой предыдущий фрагмент. так что, возможно, эта функция вам поможет.isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
Я бы использовал?1:0
вместо?true:false
но (истина / ложь)Проблема в том, что JSON как язык определения данных развился из JSON как объектной нотации JavaScript. Поскольку Javascript поддерживает eval в JSON, можно разместить код JSON внутри JSON (в этом случае использования). Если вы используете JSON для удаленной передачи данных, то я бы сказал, что размещение методов в JSON - плохая практика, потому что вы, возможно, плохо смоделировали взаимодействие клиент-сервер. И, кроме того, если вы хотите использовать JSON в качестве языка описания данных, я бы сказал, что вы можете столкнуться с проблемами, встраивая методы, потому что некоторые парсеры JSON были написаны с учетом только описания данных и могут не поддерживать определения методов в структуре.
Запись JSON в Википедии дает хороший повод не включать методы в JSON, ссылаясь на соображения безопасности:
источник
Процитируем одну из спецификаций - http://tools.ietf.org/html/rfc7159#section-12
В спецификации формата обмена данными JavaScript Object Notation (JSON) указано:
Итак, все ответы, в которых говорится, что функции не являются частью стандарта JSON, верны.
Официальный ответ: нет, определять функции в результатах JSON недопустимо!
Ответ может быть положительным, потому что «код - это данные», а «данные - это код». Даже если JSON используется как формат сериализации данных, не зависящий от языка, туннелирование «кода» через другие типы будет работать.
Строка JSON может использоваться для передачи функции JS браузеру на стороне клиента для выполнения.
Это приводит к вопросу типа: «Как выполнить код JavaScript, хранящийся в виде строки ».
Будьте готовы поднять ваш флаг «eval () is evil» и прикрепить рядом с ним флаг «не туннелировать функции через JSON».
источник
Насколько я знаю, это не стандартно. Быстрый просмотр http://json.org/ подтверждает это.
источник
Нет, определенно нет.
Если вы используете достойный сериализатор JSON, он не позволит вам сериализовать такую функцию. Это действительный ОБЪЕКТ, но недействительный JSON. Какими бы ни были намерения этого веб-сайта, он не отправляет действительный JSON.
источник
JSON явно исключает функции, потому что он не предназначен для использования в структуре данных только для JavaScript (несмотря на JS в названии).
источник
Короткий ответ - НЕТ ...
Посмотрите, почему:
Но подождите ...
Есть еще способы сохранить вашу функцию, это не рекомендуется , но все же возможно:
Мы сказали, вы можете сохранить
string
... а как насчет преобразования вашей функции в строку?Затем вы можете структурировать данные, используя,
JSON.stringify(data)
а затем использоватьJSON.parse
для их анализа (если этот шаг необходим) ...И eval для выполнения строковой функции (перед этим просто дайте вам знать, что использование eval широко не рекомендуется):
источник
С помощью NodeJS (синтаксис commonJS) я смог заставить этот тип функциональности работать, изначально у меня была только структура JSON внутри некоторого внешнего файла JS, но я хотел, чтобы эта структура была больше классом, с методами, которые можно было бы решить на время выполнения.
Объявление Executor в myJSON не требуется.
источник
Функциональные выражения в JSON вполне возможны, только не забудьте заключить его в двойные кавычки. Вот пример, взятый из проекта базы данных noSQL:
источник
хотя eval не рекомендуется, это работает:
источник
Оставьте кавычки ...
источник