【问题标题】:Uncaught SyntaxError: Unexpected token with JSON.parse未捕获的 SyntaxError:带有 JSON.parse 的意外标记
【发布时间】:2013-01-04 03:00:49
【问题描述】:

第三行出现这个错误的原因是什么?

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?这是一个数组/对象字面量。

标签: javascript jquery json


【解决方案1】:

您似乎想要stringify 对象,而不是解析。这样做:

JSON.stringify(products);

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

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

【讨论】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    的函数
    JSON.stringify(products)
    

    【讨论】:

      【解决方案4】:

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

      1. \r
      2. \t
      3. \r\n
      4. \n
      5. "

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

      【讨论】:

        【解决方案5】:

        您应该验证您的 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])) 帮了我一把。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          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()

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                原文:

                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

                【讨论】:

                • 你没有解决它,你只是把整个事情变成了一个字符串
                • 没想到那个时候。大脑无法工作。谢谢@NotSoShabby
                【解决方案11】:

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

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

                这可能会对你有所帮助。

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                      【解决方案14】:
                      [
                        {
                          "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。

                      【讨论】:

                        【解决方案15】:

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

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

                        【讨论】:

                          【解决方案16】:

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

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

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

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

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

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

                          【讨论】:

                          • 换行符也是我的问题。那么我们如何恢复这些数据呢?
                          • @kolenda 您的 JSON 无效。您需要更改您的服务器以使用返回有效 JSON 的实际 JSON 序列化程序。
                          • 我遇到了类似的问题,但路径中没有“\n”,而是有一个“\e”(我将服务器端代码更改为使用“/”而不是“\”,一切都是再次工作)
                          • 使用转义符,其中 \n 将是 \\n
                          • 我将其替换为
                            - 为我工作 - data = data.replaceAll('\n','\\u003cbr\\u003e')
                          【解决方案17】:

                          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
                          

                          【讨论】:

                            【解决方案18】:

                            希望这对其他人有所帮助。

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

                            删除注释的 HTML 后,一切正常,解析 JSON 时没有问题。

                            【讨论】:

                              【解决方案19】:

                              假设你知道它是有效的 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 字符的方法,并且成功了。
                              • 已经来过这里两次了。谢谢
                              • Base64解码后得到一个尾随特殊字符,你的方法对我帮助很大!谢谢
                              • 不要相信响应无效 JSON 的来源。只需通知他们数据已损坏。他们应该修复它。如果您尝试像这样或以类似方式“恢复”响应,您将保持不稳定的通信。
                              • 应该是s = s.replace(/[\u0000-\u001F]+/g,""); 而不是s = s.replace(/[\u0000-\u0019]+/g,""); ,用于替换所有控制字符。对吗?
                              【解决方案20】:

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

                              1. 换行符。

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

                              3. 任何独立的斜线 \(但由于某种原因不是 /,至少在 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 格式中非常难以阅读。

                              【讨论】:

                                【解决方案21】:

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

                                eval(inputString);
                                

                                【讨论】:

                                • 每次调用 eval() 都会创建一个新的 JavaScript 解释器实例。这可能会占用资源。
                                • 这是唯一对我有用的选项。谢谢
                                • 非常不鼓励使用 eval,尤其是当您通过 api 检索数据时,因为它会使您容易受到安全问题和恶意攻击
                                【解决方案22】:

                                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]);
                                

                                【讨论】:

                                  【解决方案23】:

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

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

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

                                  【讨论】:

                                  • 不是数组吗?为什么是对象。对象以 { 开头,数组以 [?或者我在这里是假的
                                  • 数组是对象;这就是.toString() 返回的内容(根据规范)。
                                  • 解决办法是先把对象字符串化吗?
                                  • @MohammedNoureldin:不;解决方案是什么都不做,使用你的对象。
                                  • 如果我使用 Ajax 从远程服务获取我的数据并返回 Json 响应怎么办?我希望将该响应保存在 JavaScript 数组对象中?
                                  【解决方案24】:
                                  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,则参数需要是一个字符串。
                                  • 我应该在 ASP Classic 中做什么,因为 ' 是注释
                                  • @ashishbhatt 你可以使用 ",然后将所有其他 " 更改为 \"
                                  • 类似JSON.parse(products.replace(/'/g, '"'))
                                  猜你喜欢
                                  • 2013-04-16
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多