Безопасно ли использовать расширенные конструкции (вызовы функций, новых функций) в JSON? - PullRequest
2 голосов
/ 19 апреля 2010

JSON - это хороший способ передать сложные данные из моего серверного кода в клиентский JavaScript. Например, в PHP я могу написать:

<script type="text/javascript>
    var MyComplexVariable = <?= BigFancyObjectGraph.GetJSON() ?>;
    DoMagic(MyComplexVariable);
</script>

Это довольно круто, но иногда вы хотите передать больше базовой даты, например даты или даже определения функций. Есть простой и прямой способ сделать это, например:

<script type="text/javascript>
    var MyComplexVariable = {
        'SimpleProperty' : 42,
        'FunctionProperty' : function()
         {
             return 6*7;
         },
         'DateProperty' : new Date(989539200000),
         'ArbitraryProperty' : GetTheMeaningOfLifeUniverseAndEverything()
    };
    DoMagic(MyComplexVariable);
</script>

И это работает как прелесть во всех браузерах, которые я видел до сих пор. Но согласно JSON.org такой синтаксис недопустим. С другой стороны, я видел, что этот синтаксис используется во многих местах, включая некоторые популярные JavaScript-фреймворки. Итак ...

Могу ли я ожидать каких-либо проблем, если использую «неподдерживаемые» функции JSON, как указано выше? Почему это неправильно или нет?

Добавлено уточнение: Если бы я ожидал, что мой JSON будет использован каким-то неизвестным сторонним программным обеспечением или даже известным анализатором, который не был браузером, то такая экзотика действительно, скорее всего, не будет работать, и я не пытаться встраивать их. Но меня интересует случай, когда код JSON написан непосредственно внутри блока кода JavaScript, который выполняется интернет-браузером. Как и в приведенных выше примерах.

1 Ответ

2 голосов
/ 19 апреля 2010

Согласно JSON.org, объект JSON поддерживает только следующие значения-члены объекта:

альтернативный текст http://json.org/value.gif

Поскольку ни одна из них не является функцией, я бы предложил не использовать ее, поскольку, как вы сказали, она официально не поддерживается в спецификации.

Кроме того, что происходит, когда не-Javascript-клиент (такой как программа Python) пытается использовать ваш JSON? Как будет работать ваш код JavaScript?

...