JSON: почему косые черты экранированы?

369

Причина этого "ускользает" от меня.

JSON избегает прямой косой черты, поэтому вместо этого {a: "a/b/c"}используется сериализация хэша .{"a":"a\/b\/c"}{"a":"a/b/c"}

Почему?

Джейсон С
источник
4
FWIW Я никогда не видел, чтобы в JSON избегались слэши, я просто заметил это с помощью библиотеки Java на code.google.com/p/json-simple
Jason S
24
PHP json_encode()по умолчанию экранирует косые черты, но имеет JSON_UNESCAPED_SLASHESопцию, начиная с PHP 5.4.0 (март 2012 г.)
Уолтер Тросс,
6
Вот код PHP, который не будет проходить через каждый слеш, только в '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx
Код включает в себя «</»: или он начинается с эха? Потому что начинать с эха мне не удается. Я просто ничего не понимаю. Да, я заменил свой $ obj на мою переменную :)
marciokoko
JSON ничего не избегает и не сериализует ... ваш сериализатор JSON делает. Какой вы используете?
Гонки

Ответы:

284

JSON не требует от вас этого, он позволяет вам это делать. Это также позволяет вам использовать «\ u0061» для «А», но это не обязательно. Разрешение \/помогает при встраивании JSON в <script>тег, который не допускает </внутренних строк, как указывает Seb.

Некоторые из Microsoft ASP.NET Ajax / JSON API используют эту лазейку для добавления дополнительной информации, например, datetime будет отправлено как "\/Date(milliseconds)\/". (Yuck)

Ruben
источник
4
Это было бы хорошо, просто убежать </. Хотя в любом случае JSON не часто включается в теги скрипта.
Рубен
8
См. Этот пост в блоге для обоснования формата даты ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Мишель ван
25
JSON необходимо заменить, потому что конкретная реализация сериализатора JSON выводит некоторый JSON, который ( будучи полностью допустимым JSON ) имеет некоторые дополнительные символы, поэтому его также можно поместить в элемент сценария HTML как литерал JS ?! Это не столько выливание ребенка из воды, сколько выплескивание ребенка, потому что кто-то купил ему комплект водных крыльев.
Квентин
15
Чего я не понимаю, так это того, почему сериализатору JSON все равно, где заканчивается JSON. На веб-странице, в запросе HTTP, что угодно. Позвольте финальному рендереру делать дополнительную кодировку, если это необходимо.
Дэн Росс
5
@DanRoss И это возможно. Экранирование /не требуется , это разрешено , чтобы облегчить использование JSON. Если ты не хочешь сбежать /, не делай этого.
Андреас
35

Спецификация JSON гласит, что вы МОЖЕТЕ избежать косой черты, но вам это не нужно.

Гарольд Л
источник
9
Можете ли вы добавить ссылку на этот конкретный раздел?
Райан Гейтс
1
В спецификации этого не сказано. На самом деле все, что он говорит, это то, что вы должны избежать персонажа солидуса. См. Ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Джоа Эберт
10
@JoaEbert: Необходимо убрать обратный солидус, но вам не нужно выходить из солидуса. Раздел 9 гласит: «Все символы могут быть помещены в кавычки, кроме символов, которые должны быть экранированы: кавычка (U + 0022), обратный солидус (U + 005C) и управляющие символы от U + 0000 до U + 001F. "
Гарольд Л
4
Спасибо Гарольд! Вы правы, также показано на рисунке 5, так как «любая кодовая точка, кроме ...» ясно указывает, что / не является обязательным.
Джоа Эберт
15

Я задал тот же вопрос некоторое время назад и должен был ответить на него сам. Вот что я придумал:

Кажется, моя первая мысль [ что это происходит из его корней JavaScript ] была правильной.

'\/' === '/'в JavaScript, и JSON является действительным JavaScript. Однако почему другие игнорируемые escape-символы (например \z) не разрешены в JSON?

Ключом к этому было чтение http://www.cs.tut.fi/~jkorpela/www/revsol.html , а затем http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . Функция экранирования косой черты позволяет встраивать JSON в HTML (как SGML) и XML.

Boldewyn
источник
5
Механизм доставки полезной нагрузки структурированных данных не должен быть привязан к языковым конструкциям ... так как это может измениться в будущем ... но это может объяснить решения по проектированию, если кто-либо из создателей JSON существует.
'\ /' === '/' Так что мне не нужно убирать косую черту при получении jsonp?
Тиммете
8

PHP по умолчанию экранирует косые черты, поэтому, вероятно, это происходит так часто. Я не уверен, почему, но, возможно, потому что встраивание строки "</script>"внутри <script>тега считается небезопасным.

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

Саймон Ист
источник
5

Уродливый PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESДолжен быть по умолчанию, а не (странно) вариант ... Как сказать это PHP-разработчиков?

По умолчанию ДОЛЖНЫ быть наиболее частое использование и (текущие) наиболее широко используемые стандарты как UTF8. Сколько фрагментов PHP-кода в Github или другом месте нуждается в этой экзотической функции «встраивания в HTML»?

Питер Краусс
источник
2
Правильно сказано! Однако PHP продвигает все свои странные ошибки в будущее, чтобы не допустить ни одной из предыдущих ошибок во всех этих поврежденных исторических фрагментах PHP, которые распространяются по всему миру как вредители. Следовательно, все эти неправильные решения, принятые PHP, а это означает, что почти все решения по PHP когда-либо становятся стандартом. Вы не можете ожидать, что стандарты изменятся, поэтому каждый разработчик PHP должен знать и реализовывать все это бесконечное количество обходных путей против всех тех серьезных ошибок, обнаруженных в PHP. Войдите в stackoverflow ..
Тино
Вы совершенно не правы. Это связано с JavaScript. Как указано ниже. В JS '\/' === '/'возвращается истина. Я бы посоветовал вам придерживаться фактов. Большинство людей могут справиться с несколькими несовместимыми именами функций. То, что вы не видите прошлого, не делает PHP плохим инструментом.
Cobolt
1
Привет @Cobolt, это старый вопрос, я сегодня не использую PHP ... Но, как говорится в блоге для обсуждения, ядро «по умолчанию ДОЛЖНО быть самым частым использованием» , так что уродство сводится к игнорированию этого «наиболее частого использования» (также некрасивое) поведение Javascript.
Питер Краусс
1
Это не место, чтобы разглагольствовать о каком-то конкретном языке. Указание на то, что в настоящее время делает PHP , и как его отключить, было бы более полезным, и теперь добавлен ответ, который делает это .
IMSoP