websockets socket nodejs fancy example ejemplo javascript json websocket

javascript - nodejs - Parse JSON recibido con resultados de WebSocket en error



websockets jsp (2)

He escrito una aplicación de prueba muy simple que crea un websocket y analiza los datos que recibe (el servidor envía datos JSON válidos). El problema es que el primer objeto JSON se analiza correctamente, pero todos los objetos subsiguientes se analizan con errores.

Aquí está todo el código:

$("#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); }; });

Lo que obtengo es: La primera vez que se llama "socket.onmessage" - JSON se analiza y la consola JS muestra un objeto. Cuando llega el segundo, lo envía a mi "log", pero JSON.parse falla con el error "Uncaught SyntaxError: Inexpected token ILEGAL". Lo que me desconcierta es que la cadena que se recibe es un objeto JSON válido; lo he probado a través de varios validadores JSON. Incluso lo copié desde mi "log", lo puse en un archivo separado y lo analicé con $ .getJSON, y funcionó bien, sin errores.

Navegador: Chrome 13.0.782.112

Cualquier idea sería útil.

Gracias.



La especificación ES5 http://ecma262-5.com/ELS5_HTML.htm#Section_15.12.1 define el espacio en blanco JSON como tab, cr, lf o sp. El skip-space de Crockford usa el siguiente código:

white = function () { // Skip whitespace. while (ch && ch <= '' '') { next(); } },

Entonces, si tiene algún carácter nulo espurio o feeds de formulario, etc. en su respuesta, el análisis JSON de ES5 arrojará un error mientras que la versión de Crockford no lo hará.