我正在node.js中通过TCP检索一些stringifyed JSON,想要解析它。所以我的方法与此类似。我缩短并简化了它,所以你不必知道周围的逻辑。
socket.on("data", function(data) {
console.log(data.toString()); // Shows the original stringifyed version
console.log(JSON.parse(data.toString())); // Doesn't work
});
完整的(美化的)JSON就是这样。如您所见,没有错误。
{
"result": "success",
"source": "chat",
"success": {
"message": "test",
"time": 1331770513,
"player": "silvinci"
}
}
但是JSON.parse(data.toString())
总是把这个愚蠢的错误抛给我:
{"result":"success","source":"console","success":{"time":1331762264,"line":"20
^
SyntaxError: Unexpected token {
at Object.parse (native)
at Socket.<anonymous> (/home/node/api.js:152:35) // irrelevant from here on
at Socket.emit (events.js:67:17)
at TCP.onread (net.js:347:14)
所以我想:“JSON-String可能出现什么问题。让我们直接尝试。不应该工作。”惊喜,惊喜!有效。当我直接输入String时为什么会这样?
答案 0 :(得分:15)
感谢@ Felix Kling我找到了我的错误。过滤未转义的字符非常重要,尤其是在字符串化的JSON之外。我没有并且在字符串化的JSON之后忽略了一个看不见的换行符。
这是修复:
socket.on("data", function(data) {
console.log(data.toString()); // Shows the original stringified version
console.log(JSON.parse(data.toString().slice(0, -4))); // Trim the sequence "\r\n" off the end of the string
});
请注意,此仅适用于我,因为我有一个非常专业的案例。服务器始终以JSON行响应,以\r\n
结束 - 不是空格字符,而是字面反斜杠r和反斜杠n。
您的代码可能(或可能)因其他错误而失败。但是,当您解析错误时,检查服务器的响应是一个很好的起点。
正如@ Zack正确指出的那样,这是用于删除意外空格的更一般修复:
JSON.parse(data.toString().trim());
答案 1 :(得分:3)
我有类似的问题。对于更通用的解决方案,这也将起作用。它取消了字符串前后的所有空格,因此您不必执行特定的子字符串长度。
JSON.parse(data.trim());
答案 2 :(得分:0)
我建议只删除有问题的字符,而不是盲目删除最后4个字符:
socket.on("data", function(data) {
console.log(data.toString()); // Shows the original stringified version
console.log(JSON.parse(data.toString().replace('\r','').replace('\n',''))); // Trim the sequence "\r\n" off the end of the string
});