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

Странное поведение JSON-синтаксического анализа в js, "Неожиданный токен:

Как показано в this jsfiddle, если у вас есть JS файл, и вы создаете объект JSON без его использования, он ведет себя по-разному в зависимости от того, будет ли ключи (члены) заключены в кавычки или нет.

действительный код: { a: 1};
неверный код: { "a": 1 };

То, что вы получите, - это сообщение об ошибке (в Chrome, другое для FF/IE, но по-прежнему не выполняется синтаксис)

Uncaught SyntaxError: Неожиданный токен:

но если вы каким-то образом используете объект, например: alert({ "a": 1 }); все снова ОК.

Почему это происходит?

4b9b3361

Ответ 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