关于javascript:Uncaught SyntaxError:带有JSON.parse的意外标记

Uncaught SyntaxError: Unexpected token with JSON.parse

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

打开控制台查看错误


products is an object. (creating from an object literal)

JSON.parse() is used to convert a string containing JSON notation into a Javascript object.

Your code turns the object into a string (by calling .toString()) in order to try to parse it as JSON text.
The default .toString() returns "[object Object]", which is not valid JSON; hence the error.


假设您知道它是有效的JSON,但您仍然得到它…

在这种情况下,字符串中可能存在隐藏/特殊字符,这些字符来自您获取它们的任何源。当粘贴到验证器中时,它们会丢失——但在字符串中它们仍然存在。这些字符虽然看不见,但会破坏JSON.parse()

如果s是您的原始json,则使用以下方法进行清理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// preserve newlines, etc - use valid JSON
s = s.replace(/\
/g,"\
"
)  
               .replace(/\'/g,"\'")
               .replace(/\"/g, '\"')
               .replace(/\\&/g,"\\&")
               .replace(/\
/g,"\
"
)
               .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);


It seems you want to stringify the object. So do this:

1
JSON.stringify(products);

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

注:我认为它试图使用json.parse('[object Array]'),抱怨它不希望在[之后使用token o


我发现JSON.parse(inputString)也有同样的问题。

在我的例子中,输入字符串来自我的服务器页面[返回页面方法]。

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

我也试过JSON.stringify(inputString),但没用。

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
products = [{"name":"Pizza","price":"10","quantity":"7
<div class="
suo-content">[collapse title=""]<ul><li>不,不要。这没有意义。</li><li>@Slaks是的,OP可以直接使用产品。但是如果他想使用<wyn>JSON.parse</wyn>,args需要是一个字符串。</li><li>我应该在ASP Classic中做什么,因为'is comment</li><li>@你可以使用"ashishbhatt",然后将所有其他"to"</li><li>像这样的东西</li></ul>[/collapse]</div><hr><P>json.parse正在参数中等待字符串。为了解决这个问题,需要将JSON对象串接起来。</P>[cc lang="javascript"]products = [{"name":"Pizza","price":"10","quantity":"7
<hr>
[cc lang="javascript"][
  {
   "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。


这是我根据以前的回答所做的一个功能:它在我的机器上工作,但YMMV。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
          /**
             * @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(/\
/g,"\
"
)  
            .replace(/\'/g,"\'")
            .replace(/\"/g, '\"')
            .replace(/\\&/g,"\\&")
            .replace(/\
/g,"\
"
)
            .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;
            }

您必须在https://jsonformatter.curiousconcept.com上使用有效的json字符串。/

有效的JSON字符串必须有双引号。

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

无引号导致错误

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

单引号导致错误

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


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

  • 新行字符。

  • 标签(是的,可以使用标签键生成标签!)

  • 任何单独的斜线\,但出于某种原因,不是/,至少不是铬合金。

  • (有关完整列表,请参阅此处的字符串部分。)

    例如,以下内容将使您获得此异常:

    1
    2
    3
    4
    5
    6
    7
    8
    {
       "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"
        }
    }

    所以应该改为:

    1
    2
    3
    4
    5
    6
    7
    8
    {
       "msg" : {
           "message":"It cannot
    contain a new-line"
    ,
           "description":"Some discription with a\t\ttabbed space",
           "value":"It cannot have 3\\4 un-escaped"
        }
    }

    我应该说,这使得它在JSON格式中非常不可读,而且文本量较大。


    When you are using POST or PUT method, make sure to stringify the body part.

    I have documented an example here
    https://gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154


    希望这能帮助别人。

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

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


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

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

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


    您所做的唯一错误是,您正在分析已经解析的对象,因此它会抛出错误,使用这个方法,您将很好地完成分析。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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.parse?它已经是对象格式的数组。

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

    这可能对你有帮助。


    显然,
    \b\t\f等并不是唯一能给你带来这种错误的问题特征。

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

    在浏览器上运行此测试代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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。

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    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对象的API给出了一个错误(在我的例子代码点火器中,当PHP代码失败时返回一个HTML),所以它不是JSON对象。

    检查SQL语句和PHP代码,并使用postman(或其他API测试人员)对其进行测试。


    哦,伙计,到目前为止,上述所有答案中的解决方案都不适用于我。我刚才也遇到了类似的问题。我设法用引号括起来解决了这个问题。请参见屏幕截图。哇。

    enter image description here

    原件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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


    您得到的错误,即"意外的令牌O",是因为需要JSON,但在解析时获得对象。"o"是单词"object"的第一个字母。


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

    1
    2
    3
    4
    5
    var i, j;

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

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


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

    1
    eval(inputString);