未捕获的语法错误:JSON.parse 的意外令牌

IT技术 javascript jquery json
2021-02-04 18:43:00

是什么导致第三行出现此错误?

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

打开控制台查看错误

6个回答

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

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

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

不是数组吗?为什么是对象。对象以 { 开头,数组以 [? 或者我在这里是假的
2021-03-17 18:43:00
如果我使用 Ajax 从远程服务获取数据,这会返回 Json 响应,该怎么办?我希望将该响应保存在 JavaScript 数组对象中?
2021-03-28 18:43:00
解决方案是先将对象字符串化吗?
2021-04-03 18:43:00
@MohammedNoureldin:不;解决方案是什么都不做并使用您的对象。
2021-04-08 18:43:00
数组是对象;这就是.toString()回报(根据规范)。
2021-04-09 18:43:00

假设您知道它是有效的 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 chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);
我收到了错误,我将其追踪到字符串中的一个奇怪字符。我使用了您删除无效 JSON 字符的方法,并且它起作用了。
2021-03-19 18:43:00
应该s = s.replace(/[\u0000-\u001F]+/g,""); 代替s = s.replace(/[\u0000-\u0019]+/g,""); ,用于替换所有控制字符。对?
2021-03-19 18:43:00
现在已经来过这里两次了。谢谢
2021-03-20 18:43:00
不要相信以无效 JSON 响应的来源。只需通知他们数据已损坏。他们应该修复它。如果您尝试像这样或以类似方式“恢复”响应,您将保持不稳定的通信。
2021-03-30 18:43:00
Base64解码后得到一个尾随特殊字符,你的方法对我帮助很大!谢谢
2021-04-11 18:43:00

似乎您想对对象进行字符串化,而不是解析。所以这样做:

JSON.stringify(products);

错误的原因是JSON.parse()期望一个String值并且products是一个Array.

注意:我认为它尝试json.parse('[object Array]')抱怨它o[.

我不知道你是如何从答案中得到“第一个字符串化”的,但添加了“不解析”以明确..
2021-03-17 18:43:00
我的观点是你不会stringify,然后立即parse那将毫无意义(除非您尝试进行深层复制或类似的奇怪操作)。也许您是说要替换parsestringify,但听起来您是先说 tostringify以便parse工作(正如我所说,这毫无意义)。
2021-03-20 18:43:00
为我工作。我对所有数组元素和数组本身进行了字符串化。然后 json.parse() 成功了。
2021-03-22 18:43:00
你为什么要这样做?它已经是一个对象。为什么将它字符串化只是为了再次将其解析回一个对象?
2021-03-24 18:43:00
@Clonkex 将其写入文件、作为文本发布、打印在文档上、进行字符串搜索、保存在数据库中、调试、取笑它以及其他一些原因......
2021-03-29 18:43:00

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

在我的情况下,输入字符串来自我的服务器页面[return of a page method]

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

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

后来我发现这[\n]是字段值内的 new line operator 的问题

我做了一个替换 [用其他字符,在解析后放回新行],一切正常。

换行符也是我的问题。那么我们怎样才能恢复这些数据呢?
2021-03-17 18:43:00
使用转义符,其中 \n 将是 \\n
2021-03-28 18:43:00
我有一个类似的问题,但不是“\n”,我在路径中有一个“\e”(我将服务器端代码更改为使用“/”而不是“\”,一切又恢复正常了)
2021-04-07 18:43:00
@kolenda 您的 JSON 无效。您需要更改服务器以使用返回有效 JSON 的实际 JSON 序列化程序。
2021-04-08 18:43:00
我用 <br> 替换它 - 为我工作 - data = data.replaceAll('\n','\\u003cbr\\u003e')
2021-04-11 18:43:00

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