Действительно ли это допустимо для определения функций в результатах JSON?

Часть ответа веб-сайта JSON имела это (... добавленный для контекста):

{..., now:function(){return(new Date).getTime()}, ...}

Добавление анонимных функций к допустимому JSON? Я ожидал бы каждый раз, когда Вы получаете доступ ко 'времени' для возврата другого значения.

97
задан Zachary Scott 4 January 2010 в 19:02
поделиться

5 ответов

JSON предназначен исключительно для языка описания данных. Как отмечалось на http://www.json.org, это "облегченный формат обмена данными". - а не язык программирования.

В соответствии с http://en.wikipedia.org/wiki/JSON поддерживаются "базовые типы":

  • Число (целое, вещественное или плавающее). точка)
  • Строка (двойная кавычка Юникода) с уходом обратного слеша)
  • Булевский (правда и ложь)
  • Массив (приказанный последовательность значений, разделенных запятыми и заключен в квадратные скобки)
  • Объект (коллекция ключей:значение пары, разделенные запятыми и вложенные в фигурных скобках)
  • null
102
ответ дан 24 November 2019 в 05:28
поделиться

Проблема в том, что JSON как язык определения данных вырос из JSON как нотация объектов JavaScript. Так как Javascript поддерживает eval на JSON, законно поместить код JSON внутри JSON (в этом случае использования). Если вы используете JSON для удаленной передачи данных, то я бы сказал, что это плохая практика - помещать методы в JSON, потому что вы, возможно, плохо смоделировали взаимодействие клиент-сервер. И, далее, при желании использовать JSON в качестве языка описания данных, я бы сказал, что вы можете попасть в неприятности, встраивая методы, потому что некоторые JSON парсеры были написаны с учетом только описания данных и могут не поддерживать определения методов в структуре.

Википедия JSON запись дает хороший повод не включать методы в JSON, ссылаясь на соображения безопасности:

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

16
ответ дан 24 November 2019 в 05:28
поделиться

Nope, definitely not.

Если вы используете приличный сериализатор JSON, он не позволит вам сериализовать такую функцию. Это действительный ОБЪЕКТ, но не действительный JSON. Какими бы ни были намерения этого сайта, он не посылает действительный JSON.

4
ответ дан 24 November 2019 в 05:28
поделиться

Насколько я знаю, она не является стандартной. Беглый взгляд на http://json.org/ подтверждает это.

.
7
ответ дан 24 November 2019 в 05:28
поделиться

JSON явно исключает функции, так как они не предназначены для данных только на JavaScript. структура (несмотря на JS в названии).

3
ответ дан 24 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: