Почему в стандарте JSON нельзя использовать двойные кавычки и обратную косую черту в строках? - PullRequest
6 голосов
/ 02 января 2011

Если я запускаю это в консоли JavaScript в Chrome или Firebug, все работает нормально.

JSON.parse('"\u0027"') // Escaped single-quote

Но если я запускаю любую из этих двух строк в консоли Javascript, выдается ошибка.*

JSON.parse('"\u0022"') // Escaped double-quote
JSON.parse('"\u005C"') // Escaped backslash

RFC 4627, раздел 2.5 , по-видимому, подразумевает, что \ и " являются допустимыми символами, если они правильно экранированы.Однако два браузера, в которых я пробовал это сделать, не позволяют этого.Есть ли что-то, что я делаю не так, или они действительно не допускаются в строках?Я также пытался использовать \" и \\ вместо \u0022 и \u005C соответственно.

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

Ответы [ 3 ]

8 голосов
/ 02 января 2011

Вы должны процитировать обратную косую черту!

то, что мы называем розой

Любое другое название будет пахнуть сладко

ДвойнойКавычка - это двойная кавычка, независимо от того, как вы выражаете ее в строковой константе.Если вы поместите обратную косую черту перед своим выражением \u внутри константы, то эффект будет заключен в двойную кавычку с обратной косой чертой, которая фактически является тем, что вы получили.

Самое интересное вВаш вопрос заключается в том, что это помогает мне понять, что каждый синтаксический анализатор строк JavaScript, который я когда-либо писал, неверен.

4 голосов
/ 02 января 2011

JavaScript интерпретирует escape-последовательности Unicode, прежде чем они попадут в анализатор JSON.Это создает проблему:

  • '"\u0027"' без кавычек в первый раз (по JavaScript): "'"Второй раз (с помощью анализатора JSON) в качестве действительного JSON, представляющего строку: '

  • '"\u0022"' в первый раз без кавычек (по JavaScript): """Синтаксический анализатор JSON видит эту версию без кавычек """ как недопустимую JSON (не ожидает последней кавычки).

  • '"\u005C"' без кавычек в первый раз (по JavaScript): "\"Парсер JSON также видит эту версию без кавычек "\" как недопустимый JSON (вторая кавычка экранирована обратной косой чертой и поэтому не завершает строку).

Исправление для этого заключается в экранированииescape-последовательность, как \\u.... В действительности, однако, вы, вероятно, просто не используете анализатор JSON.Используется в правильном контексте (обеспечивается заключением его в круглые скобки, весь JSON является допустимым JavaScript.

3 голосов
/ 02 января 2011

Вы не избегаете обратной косой черты и двойной кавычки, так как \ u00xx интерпретируется синтаксическим анализатором javascript.

JSON.parse('"\\\u0022"')
JSON.parse('"\\\""')

и

JSON.parse('"\\\u005C"')
JSON.parse('"\\\\"')

работают как положено.

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