Странное поведение JSON-синтаксического анализа в js, "Неожиданный токен:
Как показано в this jsfiddle, если у вас есть JS файл, и вы создаете объект JSON без его использования, он ведет себя по-разному в зависимости от того, будет ли ключи (члены) заключены в кавычки или нет.
действительный код: { a: 1};
неверный код: { "a": 1 };
То, что вы получите, - это сообщение об ошибке (в Chrome, другое для FF/IE, но по-прежнему не выполняется синтаксис)
Uncaught SyntaxError: Неожиданный токен:
но если вы каким-то образом используете объект, например: alert({ "a": 1 });
все снова ОК.
Почему это происходит?
Ответы
Ответ 1
Заявление:
{ a: 1 };
не литерал объекта. Это блок-оператор с одним помеченным выражением в нем. Это действительно.
Это:
{ "a": 1 };
является синтаксической ошибкой, поскольку она просто не обрабатывается. Цитируемый "a" запускает выражение в блоке, но затем следующий токен после строки представляет собой двоеточие, и нет формы выражения, которая выглядит как выражение, за которым следует двоеточие.
Сейчас:
var x = { "a": 1 };
работает, потому что "{" не интерпретируется как начало оператора блока. Этот оператор начинается с var
, поэтому это объявление переменной. Внутри выражения в правой части токена "=" единственное, что может означать "{" , - это начало литерала объекта. Аналогично, обратите внимание, что:
({ "a": 1 });
ОК, потому что открывающая скобка делает синтаксический анализатор ожидаемым вложенным подвыражением, поэтому снова "{" однозначно означает, что это начало литерала объекта.
Ответ 2
Я только понял, что при загрузке JSON через require
и имя файла не заканчивается на .json
, я получаю эту ошибку. Переименование файла на bla.json
, и он отлично работает.
Ответ 3
Эта ошибка может возникать при выполнении вызова jQuery AJAX с использованием jsonp
, когда jsonp
не требуется. Попробуйте переключить свой тип данных на ваш вызов AJAX, если это соответствует нормальному json
$.ajax({
dataType: 'json', // try using json rather than json p
...
});
Ответ 4
у меня та же проблема.
у меня есть этот файл json: {"numbers": [{"number": "1"}, {"number": "2"}]}
и получите эту ошибку: Uncaught SyntaxError: Неожиданный токен:
когда я добавляю парентезис в json следующим образом: ({"numbers": [{"number": "1"}, {"number": "2"}]});
Ошибка исчезает, но затем не получает его как JSON