Подтвердить что ты не робот

Почему кодер 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 правильно оценивать второй вывод?

4b9b3361

Ответ 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 требует, чтобы имена полей были в двойных кавычках.