Почему кодировщик JSON добавляет экранирующий символ при кодировании URL? - PullRequest
12 голосов
/ 16 сентября 2010

Я использую json_encode в PHP для кодирования URL

$json_string = array ('myUrl'=> 'http://example.com');
echo json_encode ($json_string);

Приведенный выше код генерирует следующую строку JSON:

{"myUrl":"http:\/\/example.com"}   

Вместо

{"myUrl":"http://example.com"}

Я просто новичок, какой вывод правильный?Может ли анализатор JSON правильно оценить второй вывод?

Ответы [ 4 ]

9 голосов
/ 16 сентября 2010

Согласно http://www.json.org/, следует избегать этого символа, хотя в JavaScript это не является строго обязательным:

strings

Также ознакомьтесь с кратким обсуждением этого сообщения об ошибке на php.net.

См. 2.5 из RFC :

Все символы Юникода могут быть размещены в кавычках, кроме символы, которые должны быть экранированы: кавычка, обратный солидус и управляющие символы (от U + 0000 до U + 001F).

Любой символ может быть экранирован.

Так что это не похоже на необходимо экранировать , но это возможно, и веб-сайт (и текстовая диаграмма в RFC) иллюстрирует его как экранированный.

8 голосов
/ 16 сентября 2010

Я предполагаю, что создатели этой функции добавили эту ненужную кодировку только из-за простого невежества.Для экранирования косая черта не требуется .

Удивительно большое количество программистов, которых я знаю, так же плохо держат свои косые черты, как и весь остальной мир.И еще большее число действительно плохо справляются с кодированием и декодированием.

Обновление:

После некоторых поисков я наткнулся на это обсуждение .Хорошая мысль о том, что экранирование / иногда необходимо для плохих анализаторов HTML.Однажды я столкнулся с проблемой, когда IE 6 неправильно обрабатывает контент, например:

<script>
    var json = { scriptString: "<script> /* JavaScript here */ </script>" };
</script>

IE 6 видит </script> внутри строки и слишком рано закрывает тег script.Таким образом, это более безопасно для IE 6 (хотя открывающий тег script в строке может также сломать вещи ... Я не могу вспомнить):

<script>
    var json = { scriptString: "<script> \/* JavaScript here *\/ <\/script>" };
</script>

И они также говорят, что некоторые плохие парсеры увидят// в http:// и относитесь к остальной части строки как к комментарию JavaScript.

Похоже, что это еще один случай захвата интернет-технологий из-за сбоя браузера.

4 голосов
/ 10 декабря 2011

Если вы используете php 5.4, вы можете использовать опции json_encode. см. руководство .

Несколько опций добавлено в php 5.3, но JSON_UNESCAPED_SLASHES в 5.4.

0 голосов
/ 28 января 2011

Я вижу еще одну проблему здесь.В строковом результате {"myUrl":"http://example.com"} имя члена myUrl не должно заключаться в кавычки.В JavaScript и JSON, я думаю, все идентификаторы литералов объекта являются строками без кавычек.Итак, я ожидаю, что результат будет {myUrl:"http://example.com"}.

Это кажется слишком большой ошибкой в ​​PHP, поэтому я должен ошибаться.

Редактировать, 2/11/11: Да, я не прав.Синтаксис JSON требует, чтобы даже имена полей были в двойных кавычках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...