js中奇怪的JSON解析行为,“意外的令牌:”

时间:2012-04-09 22:14:01

标签: javascript json

正如this jsfiddle中所示,如果你有一个JS文件而你没有使用它就创建了一个JSON对象,它的行为会有所不同,具体取决于键(成员)是否用引号括起来。

有效代码:{ a: 1};
代码无效:{ "a": 1 };

您将得到的是错误消息(在Chrome中,与FF / IE不同,但语法仍然失败)

  

Uncaught SyntaxError:意外的令牌:

但是如果你以某种方式使用该对象,例如:alert({ "a": 1 });一切都还可以。

为什么会这样?

3 个答案:

答案 0 :(得分:61)

声明:

{ a: 1 };

对象文字。它是一个块语句,其中包含一个带标签的表达式。这是有效的。

此:

{ "a": 1 };

是语法错误,因为它只是不可解析。引用的“a”在块内部启动一个表达式语句,但是然后字符串后面的下一个标记是冒号,并且没有表达式形式看起来像一个表达式后面跟一个冒号。

现在:

var x = { "a": 1 };

有效,因为“{”不被解释为块语句的开头。该语句以var开头,因此它是一个变量声明。在“=”标记右侧的表达式中,“{”唯一可以表示的是对象文字的开头。同样,请注意:

({ "a": 1 });

没问题,因为左括号使解析器期望嵌套的子表达式,所以“{”再次明确表示它是对象文字的开头。

答案 1 :(得分:3)

我刚刚意识到,通过require加载JSON并且文件名不在.json结束时,我收到此错误。将文件重命名为bla.json,它可以正常工作。

答案 2 :(得分:2)

当不需要jsonp时,使用jsonp进行jQuery AJAX调用时,可能会弹出此错误。如果正常情况json

,则尝试在AJAX调用上切换数据类型
$.ajax({
     dataType: 'json', // try using json rather than json p
     ...
});