В соответствии со схемой конечного автомата на веб-сайте JSON допускаются только экранированные символы двойных кавычек, а не одинарные. Символы одинарных кавычек не должны быть экранированы:
Обновление - Больше информации для интересующихся:
<ч />
Дуглас Крокфорд конкретно не говорит, почему спецификация JSON не допускает экранированные одинарные кавычки в строках. Однако во время обсуждения JSON в Приложении E JavaScript: Хорошие части он пишет:
Цели JSON были минимальными, переносимыми, текстовыми и представляли собой подмножество JavaScript. Чем меньше нам нужно договориться о взаимодействии, тем легче нам взаимодействовать.
Так что, возможно, он решил разрешить определять строки только с помощью двойных кавычек, поскольку это еще одно правило, с которым должны согласиться все реализации JSON. В результате невозможно, чтобы одиночный символ кавычки в строке случайно завершил строку, потому что по определению строка может заканчиваться только символом двойной кавычки. Следовательно, нет необходимости разрешать экранирование символа одинарной кавычки в формальной спецификации.
<ч />
Пропуская немного глубже, реализация Крокфорда org.json JSON для Java более допустима, а делает допускает символы одинарных кавычек:
Тексты, создаваемые методами toString, строго соответствуют правилам синтаксиса JSON. Конструкторы более снисходительны в текстах, которые они примут:
...
- Строки могут быть заключены в кавычки '(одинарные кавычки).
Это подтверждается исходным кодом JSONTokener . Метод nextString
принимает экранированные символы одинарных кавычек и обрабатывает их как символы двойных кавычек:
public String nextString(char quote) throws JSONException {
char c;
StringBuffer sb = new StringBuffer();
for (;;) {
c = next();
switch (c) {
...
case '\\':
c = this.next();
switch (c) {
...
case '"':
case '\'':
case '\\':
case '/':
sb.append(c);
break;
...
В верхней части метода находится информативный комментарий:
Формальный формат JSON не допускает строки в одинарных кавычках, но реализация может принимать их.
Так что некоторые реализации будут принимать одинарные кавычки - но вы не должны полагаться на это. Многие популярные реализации довольно ограничительны в этом отношении и будут отклонять JSON, который содержит строки в одинарных кавычках и / или экранированные одинарные кавычки.
<ч />
Наконец, чтобы связать это с первоначальным вопросом, jQuery.parseJSON
сначала пытается использовать собственный анализатор JSON браузера или загруженную библиотеку, такую как json2.js , где это применимо (что примечание - библиотека, на которой основана логика jQuery, если JSON
не определено). Таким образом, jQuery может быть таким же разрешающим, как и базовая реализация:
parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
jQuery.error( "Invalid JSON: " + data );
},
Насколько мне известно, эти реализации придерживаются только официальной спецификации JSON и не принимают одинарные кавычки, следовательно, jQuery также не допускается.