我编写了一个非常简单的测试应用程序,它创建一个 websocket 并解析它接收到的数据(服务器发送有效的 JSON 数据)。
问题是第一个JSON对象解析成功,但是后面的所有对象都解析出错。

这是所有的代码:

$("#connect").click(function ()
    {
        socket = new WebSocket("my server address");
        socket.onopen = function ()
        {
            $("#log").append("Connection opened.<br/>");

            socket.send(/* login information goes here */));
        };
        socket.onerror = function (e)
        {
            $("#log").append("Error: " + e.data + "<br/>");
        };
        socket.onclose = function ()
        {
            $("#log").append("Connection closed.<br/>");
        };
        socket.onmessage = function (e)
        {
            $("#log").append(index.toString() + ": " + e.data + "<br/><br/>");

            console.log("Parsing " + index);
            index++;
            var obj = JSON.parse(e.data);
            console.log("Parsed:");
            console.log(obj);
        };
    });

我得到的是:第一次调用“socket.onmessage” - 解析 JSON 并且 JS 控制台显示一个对象。当第二个到达时,它将它输出到我的“日志”,但 JSON.parse 失败并显示错误“Uncaught SyntaxError: Unexpected token ILLEGAL”。
让我感到困惑的是,收到的字符串是一个有效的 JSON 对象——我已经通过几个 JSON 验证器对其进行了测试。我什至从我的“日志”中复制粘贴了它,把它放在一个单独的文件中,并用 $.getJSON 解析它 - 它工作正常,没有错误。

浏览器:Chrome 13.0.782.112

任何想法都会有所帮助。

谢谢你。

最佳答案

ES5 规范 http://ecma262-5.com/ELS5_HTML.htm#Section_15.12.1 将 JSON 空格定义为 tab、cr、lf 或 sp。 Crockford 跳过空间使用以下代码:

        white = function () {

// Skip whitespace.

            while (ch && ch <= ' ') {
                next();
            }
        },

因此,如果您的响应中有任何虚假的空字符或表单馈送等,那么 ES5 JSON 解析将引发错误,而 Crockford 版本则不会。

关于javascript - 使用 WebSocket 解析收到的 JSON 导致错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7116035/

10-12 12:35
查看更多