未捕获SyntaxError: JSON.parse"

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

var 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"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

打开控制台以查看错误

1232148 次浏览
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"}]';

products是一个对象。(从对象字面量创建)

JSON.parse()用于将包含JSON符号的字符串转换为Javascript对象。

你的代码将对象转换为字符串(通过调用.toString()),以便尝试将其解析为JSON文本 默认的.toString()返回"[object Object]",这不是有效的JSON;

似乎你想stringify对象,而不是解析。所以这样做:

JSON.stringify(products);

出现错误的原因是JSON.parse()期望的是String值,而productsArray

注意:我认为它尝试json.parse('[object Array]'),它抱怨在[之后它没有期望令牌o

产品是一个可以直接使用的数组:

var i, j;


for(i=0; i<products.length; i++)
for(j in products[i])
console.log("property name: " + j, "value: " + products[i][j]);

我在JSON.parse(inputString)中发现了同样的问题。

在我的例子中,输入字符串来自我的服务器页面(返回一个page方法)

我打印了typeof(inputString) -它是字符串,但仍然发生错误。

我也尝试了JSON.stringify(inputString),但它没有帮助。

后来我发现这是一个问题与新的行操作符[\n],在一个字段值。

我做了一个替换(使用其他字符,在解析后将新行放回)和一切工作正常。

使用eval。它将JavaScript表达式/代码作为字符串,并计算/执行它。

eval(inputString);

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

  1. 新行字符。

  2. 制表符(是的,可以用Tab键生成的制表符!)

  3. 任何独立斜杠\(但出于某种原因不是/,至少在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格式和大量文本中非常不可读。

假设你知道它是有效的JSON,但你仍然得到这个。

在这种情况下,字符串中很可能存在隐藏/特殊字符,无论您从哪个来源获取它们。当你粘贴到一个验证器时,它们就丢失了——但是在字符串中它们仍然存在。这些字符虽然不可见,但会中断JSON.parse()

如果s是你的原始JSON,那么用:

// Preserve newlines, etc. - use valid JSON
s = s.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");
// Remove non-printable and other non-valid JSON characters
s = s.replace(/[\u0000-\u0019]+/g,"");
var o = JSON.parse(s);

我的问题是,我通过AjaxPHP回调函数中注释了HTML,该函数正在解析注释并返回无效的JSON。

一旦我删除了带注释的HTML,一切都很好,JSON被解析没有任何问题。

JSON。parse在参数中等待一个字符串。您需要对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"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem

当使用帖子方法时,请确保对body部分进行了字符串化。

我已经在这里记录了一个例子 https://gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154 < / p >
[
{
"name": "Pizza",
"price": "10",
"quantity": "7"
},
{
"name": "Cerveja",
"price": "12",
"quantity": "5"
},
{
"name": "Hamburguer",
"price": "10",
"quantity": "2"
},
{
"name": "Fraldas",
"price": "6",
"quantity": "2"
}
]

下面是您可以解析的完美JSON内容。

现在显然\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;
}
}
}

这是一个基于之前的回复的函数:它在我的机器上工作,但YMMV

/**
* @description Converts a string response to an array of objects.
* @param {string} string - The string you want to convert.
* @returns {array} - an array of objects.
*/
function stringToJson(input) {
var result = [];


// Replace leading and trailing [], if present
input = input.replace(/^\[/, '');
input = input.replace(/\]$/, '');


// Change the delimiter to
input = input.replace(/},{/g, '};;;{');


// Preserve newlines, etc. - use valid JSON
//https://stackoverflow.com/questions/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
input = input.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");


// Remove non-printable and other non-valid JSON characters
input = input.replace(/[\u0000-\u0019]+/g, "");


input = input.split(';;;');


input.forEach(function(element) {
//console.log(JSON.stringify(element));


result.push(JSON.parse(element));
}, this);


return result;
}

为什么需要JSON.parse?它已经是对象数组格式了。

最好使用JSON。Stringify如下所示:

var b = JSON.stringify(products);

哦,天哪,之前所有答案中的解决方案对我都不起作用。我刚才也遇到了类似的问题。我设法解决了它与包装与报价。请看截图。喔!

Enter image description here

原:

var 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"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token 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,但在解析时获得了一个对象。,“o"是单词“object”的第一个字母。

如果有前导空格或尾随空格,则无效。 后面和前面的空格可以删除为

mystring = mystring.replace(/^\s+|\s+$/g, "");

来源:JavaScript:修剪字符串的前导空格或尾空格

唯一的错误是您正在解析一个已经解析过的对象,因此它抛出一个错误。用这个你就可以走了。

var 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"
}];
console.log(products[0].name); // Name of item at 0th index

如果想打印整个JSON内容,请使用JSON.stringify()。

它可能发生的原因有很多,但可能是一个无效的字符,所以你可以使用JSON.stringify(obj);,将你的对象转换为JSON,但请记住,它是一个jQuery表达式。

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

所以它抛出JSON中0号位置的意外标记n

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

在我的情况下,在我的JSON字符串中有以下字符问题:

  1. r \
  2. \ t
  3. \ r \ n
  4. \ n
  5. “;

我用其他字符或符号替换了它们,然后又从编码中恢复过来。

现在这是一个JavaScript对象数组,而不是JSON格式。要将其转换为JSON格式,需要使用一个名为JSON.stringify ()的函数。

JSON.stringify(products)