我编写了一个非常简单的测试应用程序,它创建一个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
任何想法都会有所帮助。
谢谢。
答案 0 :(得分:3)
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版本则不会。
答案 1 :(得分:0)