【问题标题】:Parse JSON received with WebSocket results in error解析使用 WebSocket 接收的 JSON 会导致错误
【发布时间】:2011-10-30 06:29:46
【问题描述】:

我编写了一个非常简单的测试应用程序,它创建一个 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

任何想法都会有所帮助。

谢谢。

【问题讨论】:

  • 也许您已经在服务器中设置了内容类型?那么数据就不需要更多的解析了。已经发生在我身上,白白发疯了一天
  • @pif hmm,我觉得这里不是这样,数据是通过websocket接收的。
  • 啊好吧...在我的情况下无论如何我正在使用java servlet,然后设置 {response.setContentType("application/json")} 然后尝试像你一样解析它做并得到Unexpexted token error thingy。像你一样,我试图复制和粘贴浏览器正在获取的内容,它也是一个有效的 json。当我试图不解析它并访问数据时,它就像一个魅力。
  • 您是否尝试过将“e.data”的输出(第一次和第二次尝试)并进行比较,可能会在此处发布。
  • @Sunday 我试过了。而且我确实相信这是一个错误,因为解决这个问题的方法是使用 JSON.parse 源代码,而不是实际调用 JSON.parse。您可以在这里查看“第二次更新” - stackoverflow.com/questions/7123908/…

标签: javascript json websocket


【解决方案1】:

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

        white = function () {

// Skip whitespace.

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

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

【讨论】:

  • 谢谢,我去看看收到的数据。
  • 我刚刚发现字符串中确实存在空字符。 .replace(/[\s\0]/g, ' ') 允许我使用 JSON.parse。非常感谢,非常感谢您的帮助:)
【解决方案2】:

你应该这样做:

$.parseJSON( json );

查看更多信息: http://api.jquery.com/jQuery.parseJSON/

【讨论】:

  • 在尝试解析之前确保您的 JSON 有效。你可以在这里验证:jsonlint.com
  • 抱歉,您似乎没有阅读问题(最后几句话)。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多