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 |
打开控制台查看错误
Your code turns the object into a string (by calling
The default
假设您知道它是有效的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); |
错误的原因是
注:我认为它试图使用
我发现
在我的例子中,输入字符串来自我的服务器页面[返回页面方法]。
我打印了
我也试过
后来我发现这是一个新的行操作符
]
我做了一个替换(用其他字符,解析后放回新行),一切正常。
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 |
调用
新行字符。
标签(是的,可以使用标签键生成标签!)
任何单独的斜线
(有关完整列表,请参阅此处的字符串部分。)
例如,以下内容将使您获得此异常:
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,如下所示:
这可能对你有帮助。
显然,
请注意,有些浏览器可能对
在浏览器上运行此测试代码:
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上测试时,我发现它不允许
chars 34和92分别是
为了帮助调试,在执行
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测试人员)对其进行测试。
哦,伙计,到目前为止,上述所有答案中的解决方案都不适用于我。我刚才也遇到了类似的问题。我设法用引号括起来解决了这个问题。请参见屏幕截图。哇。
原件:
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,所以您可以使用
使用
1 | eval(inputString); |