Comportement d'analyse JSON étrange dans js, "jeton inattendu:"

Comme cela a été démontré dans cette jsfiddle , si vous avez un fichier JS et que vous créez un objet JSON sans l'utiliser, il se comporte différemment selon que les clés (membres) sont enroulées entre guillemets ou non.

Code valide: { a: 1};
Code invalide: { "a": 1 };

Ce que vous obtiendrez est un message d'erreur (en Chrome, différent pour FF / IE, mais échoue toujours sur la syntaxe)

Uncaught SyntaxError: jeton inattendu:

Mais si vous utilisez l'objet d'une façon ou d'une autre, par exemple: alert({ "a": 1 }); Tout recommence.

Pourquoi cela se produit-il?

La déclaration:

 { a: 1 }; 

N'est pas un objet littéraire. C'est une déclaration de bloc avec une expression marquée. C'est valide.

Ce:

 { "a": 1 }; 

Est une erreur de syntaxe car il n'est tout simplement pas possible d'être analysé. Le "a" cité commence une déclaration d'expression à l'intérieur du bloc, mais le jeton suivant après que la chaîne est en deux points, et il n'y a pas de forme d'expression qui ressemble à une expression suivie d'un colon.

À présent:

 var x = { "a": 1 }; 

Fonctionne car "{" n'est pas interprété comme le début d'une déclaration de bloc. Cette déclaration commence par var , donc c'est une déclaration variable. Dans l'expression sur le côté droit du jeton "=", la seule chose qu'un "{" peut signifier est le début d'un objet littéral. De même, notez que:

 ({ "a": 1 }); 

Est OK parce que la parenthèse d'ouverture fait que l'analyseur s'attend à une sous-expression imbriquée, de sorte que le "{" signifie sans ambages que c'est le début d'un objet littéraire.

Cette erreur peut apparaître lorsque vous effectuez un appel jsonp AJAX à l'aide de jsonp lorsque jsonp n'est pas nécessaire. Essayez de changer votre type de données sur votre appel AJAX si tel est le cas pour le json normal

 $.ajax({ dataType: 'json', // try using json rather than json p ... }); 

Je viens de réaliser que lors du chargement du JSON via le require et que le nom de fichier ne se termine pas sur .json je reçois cette erreur. Renommer le fichier à bla.json et ça marche bien.