奇怪的JSON.parse()在node.js错误

我正在通过node.js中的TCP检索一些string化的JSON,并且想要parsing它。 所以我的方法与此相似。 我缩短并简化它,所以你不必知道周围的逻辑。

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有什么问题,我们直接试试吧,不应该工作。 惊喜,惊喜! 有效。 为什么当我直接inputstring时它工作?

感谢@ Felix Kling,我find了我的错误。 过滤未转义的字符非常重要,特别是在string化的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。
您的代码可能(或可能)由于其他错误而失败。 但是当你parsing错误时,检查服务器的响应是一个很好的起点。

正如@ Zack正确指出的那样,这是一个更一般的修复方法,用于移除意外的空白:

 JSON.parse(data.toString().trim()); 

我有一个类似的问题。 对于更一般的解决scheme,这也将起作用。 它将string前后的所有空白字符分开,所以不必执行特定的子string长度。

 JSON.parse(data.trim());