是什么导致了第三行上的错误?

Var product = [{ “名称”:“披萨”, “价格”:“10”, “数量”:“7” },{ “名称”:“Cerveja”, “价格”:“12”, “数量”:“5” },{ “名称”:“汉堡”, “价格”:“10”, “数量”:“2” },{ “名称”:“Fraldas”, “价格”:“6”, “数量”:“2” }); console.log(产品); var b = JSON.parse(products);//意外令牌o

打开控制台以查看错误


当前回答

您应该在这里验证JSON字符串。

一个有效的JSON字符串必须在键周围有双引号:

JSON.parse({"u1":1000,"u2":1100})       // will be ok

如果没有引号,它将导致一个错误:

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

使用单引号也会导致错误:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1

其他回答

您应该在这里验证JSON字符串。

一个有效的JSON字符串必须在键周围有双引号:

JSON.parse({"u1":1000,"u2":1100})       // will be ok

如果没有引号,它将导致一个错误:

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

使用单引号也会导致错误:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1

现在,\r、\b、\t、\f等显然不是唯一会给你这个错误的有问题的字符。

注意,有些浏览器可能对JSON.parse的输入有额外的要求。

在浏览器中运行测试代码:

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.push(x);
    }
}
console.log(arr);

在Chrome上测试,我看到它不允许JSON.parse(String.fromCharCode(0x22, x, 0x22));其中x是34 92,或者从0到31。

字符34和92分别是"和\字符,它们通常是预期字符和正确转义字符。0到31个字符会给你带来问题。

为了帮助调试,在执行JSON.parse(input)之前,首先验证输入不包含有问题的字符:

function VerifyInput(input){
    for(var x=0; x<input.length; ++x){
        let c = input.charCodeAt(x);
        if(c >= 0 && c <= 31){
            throw 'problematic character found at position ' + x;
        }
    }
}

在调用JSON.parse()时,另一个可能导致“SyntaxError: Unexpected token”异常的问题是在字符串值中使用以下任何一种:

新行字符。 制表符(是的,可以用Tab键生成的制表符!) 任何独立的斜杠\(但出于某种原因不是/,至少在Chrome上不是)。

(完整列表请参见这里的字符串部分。)

例如,下面的代码会让你得到这个异常:

{
    "msg" : {
        "message": "It cannot
contain a new-line",
        "description": "Some discription with a     tabbed space is also bad",
        "value": "It cannot have 3\4 un-escaped"
    }
}

所以应该改为:

{
    "msg" : {
        "message": "It cannot\ncontain a new-line",
        "description": "Some discription with a\t\ttabbed space",
        "value": "It cannot have 3\\4 un-escaped"
    }
}

我应该说,这使得它在json格式和大量文本中非常不可读。

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

改变

products = '[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]';

我所犯的错误是将null(不知情)传递给JSON.parse()。

所以它在JSON的0号位置抛出了意外令牌n。

但是当你在JSON.parse()中传递一些不是JavaScript对象的东西时,就会发生这种情况。