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

bus*_*ens 6 javascript json v8 node.js

我正在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
});
Run Code Online (Sandbox Code Playgroud)

完整的(美化的)JSON就是这样.如您所见,没有错误.

{
    "result": "success",
    "source": "chat",
    "success": {
        "message": "test",
        "time": 1331770513,
        "player": "silvinci"
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

所以我想:"JSON-String可能出现什么问题.让我们直接尝试.不应该工作." 惊喜,惊喜!有效.当我直接输入字符串时为什么它可以工作?

bus*_*ens 16

感谢@ 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
});
Run Code Online (Sandbox Code Playgroud)

请注意,这只适用于我,因为我有一个非常专业的案例.服务器始终以JSON行响应,它们以\r\n- 而不是空格字符终止,但字面上反斜杠r和反斜杠n.
您的代码可能(或可能)因其他错误而失败.但是,当您解析错误时,检查服务器的响应是一个很好的起点.

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

JSON.parse(data.toString().trim());
Run Code Online (Sandbox Code Playgroud)

  • 不知道上下文,无条件截断字符串似乎有点危险.也许你应该在切片之前为违规字符添加测试. (3认同)