Почему кодер JSON добавляет escape-символ при кодировании URL-адресов?
Я использую 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 правильно оценивать второй вывод?
Ответы
Ответ 1
В соответствии с http://www.json.org/ следует избегать этого символа, хотя это не является строго необходимым в JavaScript:
![strings]()
Также прочтите этот отчет об ошибке на php.net для краткого обсуждения.
См. 2.5 RFC:
Все символы Юникода могут быть размещены в кавычках, за исключением символы, которые должны быть экранированы: кавычки, обратного солидуса и управляющие символы (U + 0000 через U + 001F).
Любой символ может быть экранирован.
Таким образом, это не похоже на то, что нуждается в для экранирования, но это может быть, и веб-сайт (и текстовая диаграмма в RFC) иллюстрирует его как экранированный.
Ответ 2
Мое предположение состоит в том, что авторы этой функции добавили, что ненужное кодирование происходит не более, чем простое незнание. Экранирование косых черт не требуется.
Удивительно большое количество программистов, которых я знаю, так же плохи, что их косые черты прямо, как и весь остальной мир. И еще большее число действительно плохо работает при правильном кодировании и декодировании.
Update:
После выполнения некоторых поисков я столкнулся с этим обсуждением. Это приводит к хорошему моменту, когда экранирование /
иногда необходимо для плохих парсеров 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.
Итак, похоже, что это еще один случай, когда интернет-технологии захватываются браузером Fail.
Ответ 3
Если вы используете php 5.4, вы можете использовать опции json_encode
. см. manual.
Несколько параметров добавлены в php 5.3, но JSON_UNESCAPED_SLASHES
в 5.4.
Ответ 4
Я вижу здесь еще одну проблему. Результат строки {"myUrl":"http://example.com"}
не должен содержать имя члена myUrl. В JavaScript и JSON я считаю, что все объектные литеральные идентификаторы элементов являются некотируемыми строками. Итак, я ожидаю, что результат будет {myUrl:"http://example.com"}
.
Это кажется слишком большой ошибкой в PHP, поэтому я должен ошибаться.
Редактировать, 2/11/11: Да, я ошибаюсь. Синтаксис JSON требует, чтобы имена полей были в двойных кавычках.