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


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

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

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

9 90

9 ответов:

нет.

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

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

  • число (целое, вещественное, или плавающий точка)
  • строка (Юникод в двойных кавычках с обратной косой чертой)
  • Boolean (истинный и ложь)
  • массив (упорядоченная последовательность значений, разделенных запятыми и заключен в квадратные скобки)
  • объект (коллекция ключа: значение пары, разделенные запятыми и заключенные в фигурных скобках)
  • null

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

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

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

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

давайте процитируем одну из спецификаций -http://tools.ietf.org/html/rfc7159#section-12

на спецификация формата обмена данными JavaScript Object Notation (JSON) гласит:

JSON является подмножеством JavaScript, но исключает назначение и призвание.

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

поэтому все ответы, которые утверждают, что функции не являются частью стандарта JSON, являются правильными.

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


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

строка JSON может использоваться для передачи функции JS в браузер на стороне клиента для выполнения.

[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]

Это приводит к вопросу типа: как "выполнение кода JavaScript, хранящегося в виде строка".

будьте готовы, чтобы поднять свой флаг" eval() is evil "и вставить рядом с ним флаг" не туннелировать функции через JSON".

нет, определенно нет.

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

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

короткий ответ:нет...

JSON-это текстовый формат, который полностью независим от языка, но использует соглашения, которые знакомы программистам семейства C языки, включая C, C++, C#, Java, JavaScript, Perl, Python и многие другие. Эти свойства делают JSON идеальным обменом данными язык.

смотреть на причину:

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

JSON-это текст, и мы можем преобразовать любой объект JavaScript в JSON, и отправить JSON на сервер.

мы также можем конвертировать любой JSON, полученный с сервера в JavaScript объекты.

таким образом, мы можем работать с данными как с объектами в JavaScript, без сложный разбор и переводы.

но ждать...

есть еще способы сохранить ваш функция, это широко не рекомендуется к этому, но все же возможно:

мы сказали, Вы можете сохранить string... как насчет преобразования вашей функции в строку?

const data = {func: '()=>"a FUNC"'};

затем вы можете строку данных с помощью JSON.stringify(data) и затем с помощью JSON.parse, чтобы разобрать его (если этот шаг не нужен)...

и eval чтобы выполнить строковую функцию (прежде чем делать это, просто дайте вам знать, используя eval широко не рекомендуется):

eval(data.func)(); //return "a FUNC"

оставьте кавычки...

var a = {"b":function(){alert('hello world');} };

a.b();

выражения функций в JSON вполне возможны, только не забудьте заключить их в двойные кавычки. Вот пример, взятый из дизайна базы данных noSQL:

{
  "_id": "_design/testdb",
  "views": {
    "byName": {
      "map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
    }
  }
}