ChatGPT解决这个技术问题 Extra ChatGPT

未捕获的 SyntaxError:带有 JSON.parse 的意外标记

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

var products = [{“名称”:“披萨”,“价格”:“10”,“数量”:“7”},{“名称”:“Cerveja”,“价格”:“12”,“数量” :“5”},{“名称”:“汉堡包”,“价格”:“10”,“数量”:“2”},{“名称”:“弗拉达斯”,“价格”:“6”,“数量": "2" }];控制台.log(产品); var b = JSON.parse(产品); //意外的令牌o

打开控制台查看错误

你没有任何JSON?这是一个数组/对象文字。

S
SLaks

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

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

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


它不是一个数组吗?为什么是对象。对象以 { 开头,数组以 [?还是我在这里是假的
数组是对象;这就是 .toString() 返回的内容(根据规范)。
解决方案是先对对象进行字符串化吗?
@MohammedNoureldin:不;解决方案是什么都不做并使用您的对象。
如果我使用 Ajax 从远程服务获取我的数据并返回 Json 响应,该怎么办?我希望将该响应保存在 JavaScript 数组对象中吗?
E
EdH

假设你知道它是有效的 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);

Base64解码后得到一个尾随特殊字符,你的方法对我帮助很大!谢谢
不要相信响应无效 JSON 的来源。只需通知他们数据已损坏。他们应该修复它。如果您尝试像这样或以类似方式“恢复”响应,您将保持不稳定的通信。
应该是 s = s.replace(/[\u0000-\u001F]+/g,""); 而不是 s = s.replace(/[\u0000-\u0019]+/g,""); ,用于替换所有控制字符。正确的?
s.replace(/\\n/g, "\\n") 背后的逻辑是什么我测试过,它适用于例如"abc\\ndef".replace(/\\n/g,"\\'");它会变成abc\'def你为什么要这样做? json是否不允许以反斜杠结束一行..您能否评论一下您的示例的作用以及原因
谢谢,这真的很有帮助。尤其是当您将 JSON 复制到剪贴板并且控制台中隐藏了特殊的结束行字符时。
O
Onur Yıldırım

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

JSON.stringify(products);

错误的原因是 JSON.parse() 需要 String 值,而 productsArray

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


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

我发现与 JSON.parse(inputString) 相同的问题。

在我的情况下,输入字符串来自我的服务器页面[返回页面方法]。

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

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

后来我发现这是字段值内的换行符 [\n] 的问题。

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


换行符也是我的问题。那么我们如何才能恢复这些数据呢?
@kolenda 您的 JSON 无效。您需要更改您的服务器以使用返回有效 JSON 的实际 JSON 序列化程序。
我有一个类似的问题,但我在路径中有一个“\e”而不是“\n”(我将服务器端代码更改为使用“/”而不是“\”,一切都恢复正常了)
使用转义符,其中 \n 将是 \\n
我用
替换它 - 为我工作 - data = data.replaceAll('\n','\\u003cbr\\u003e')
T
Térence

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

F
F1Krazy

您应该验证您的 JSON 字符串 here

有效的 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

在我的例子中,Grails 2.5.6 用单引号呈现 render ([key: value]),导致 jquery Ajax 中位置 1 的 JSON parseError。 render (groovy.json.JsonOutput.toJson ([key:value])) 帮助了我。
p
pktangyue
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"}]';

@SLaks 是的,OP 可以直接使用产品。但如果他想使用 JSON.parse,则 args 需要是一个字符串。
我应该在 ASP Classic 中做什么,因为 ' 是评论
@ashishbhatt 您可以使用“,然后将所有其他“更改为 \”
像这样JSON.parse(products.replace(/'/g, '"'))
a
att

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

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

来源:http://www.toptip.ca/2010/02/javascript-trim-leading-or-trailing.html


t
tmurphree

这是我根据以前的回复制作的一个功能:它可以在我的机器上运行,但是 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 chars
            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;
            }

c
c00000fd

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

换行符。选项卡(是的,您可以使用 Tab 键生成的选项卡!)任何独立的斜杠 \(但由于某种原因不是 /,至少在 Chrome 上不是。)

(有关完整列表,请参阅 String section here。)

例如,以下内容将为您提供此异常:

{
    "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 格式中非常难以阅读。


h
hering
[
  {
    "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。


C
Chris

希望这对其他人有帮助。

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

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


M
Manjunath Reddy

当您使用 POST 或 PUT 方法时,请确保对正文部分进行字符串化。

我在这里记录了一个示例https://gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154


K
Kiran Maniya

您正在做的唯一错误是,您正在解析已经解析的对象,所以它会抛出错误,使用它,您会很高兴。

var products = [{“名称”:“披萨”,“价格”:“10”,“数量”:“7”},{“名称”:“Cerveja”,“价格”:“12”,“数量” :“5”},{“名称”:“汉堡包”,“价格”:“10”,“数量”:“2”},{“名称”:“弗拉达斯”,“价格”:“6”,“数量": "2" }];控制台.log(产品[0].name); //第0个索引处的项目名称

如果要打印整个 json,请使用 JSON.stringify()


i
ic3b3rg

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

var i, j;

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

P
Pacerier

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

W
Well Smith

哦,伙计,到目前为止提供的所有上述答案中的解决方案都对我不起作用。我刚才也有类似的问题。我设法用引号来解决它。请参阅屏幕截图。哇。

https://i.stack.imgur.com/E5H4x.png

原来的:

var products = [{“名称”:“披萨”,“价格”:“10”,“数量”:“7”},{“名称”:“Cerveja”,“价格”:“12”,“数量” :“5”},{“名称”:“汉堡包”,“价格”:“10”,“数量”:“2”},{“名称”:“弗拉达斯”,“价格”:“6”,“数量": "2" }];控制台.log(产品); var b = JSON.parse(产品); //意外的令牌o


你没有解决它,你只是把整个事情变成了一个字符串
没想到那个时候。大脑无法工作。谢谢@NotSoShabby
S
Shashank Bodkhe

您得到的错误,即“意外的令牌 o”是因为 json 是预期的,但在解析时获取了对象。那个“o”是单词“object”的第一个字母。


E
Elvis Silva Noleto

发生这种情况的原因有很多,但可能是因为字符无效,因此您可以使用 JSON.stringify(obj); 将您的对象转换为 JSON,但请记住它是 JQUERY 表达式。


F
Faraz Ahmed

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

\r \t \r\n \n : "

我已将它们替换为其他字符或符号,然后再次从编码中恢复。


M
MD SHAYON

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

JSON.stringify(products)

A
Abhijit Padhy

为什么需要 JSON.parse?它已经在对象格式的数组中。

更好地使用 JSON.stringify 如下:var b = JSON.stringify(products);

这可能会对您有所帮助。


A
Aashutosh Rathi

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

所以它抛出了Unexpected token n in JSON at position 0

但是,每当您在 JSON.parse() 中传递不是 JS 对象的东西时,就会发生这种情况


J
Jawa

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

eval(inputString);

每次调用 eval() 都会创建一个新的 JavaScript 解释器实例。这可能是一种资源消耗。
这是唯一对我有用的选项。谢谢
非常不鼓励使用 eval,特别是如果您通过 api 检索数据,因为它会使您容易受到安全问题和恶意攻击