2012-10-08 57 views
8

Estoy tratando de hacer un experimento con HTML5, WebSocket y File API. Estoy usando la implementación Tomcat7 WebSocket. Puedo enviar y recibir mensajes de texto del servlet. Lo que quiero hacer ahora es enviar desde el servlet a los objetos JSON del cliente, pero quiero evitar el mensaje de texto para omitir el JSON.parse (o similar) en el cliente, así que estoy tratando de enviar mensajes binarios. . La parte servlet es muy simple:File API - Blob to JSON

String s = "{arr : [1,2]}"; 
CharBuffer cbuf = CharBuffer.wrap(s);  
CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();  
getWsOutbound().writeBinaryMessage(encoder.encode(cbuf)); 
getWsOutbound().flush(); 

Después de este mensaje, en el cliente veo que he recibido una trama binaria, que se convierte en un objeto Blob (http://www.w3.org/TR/FileAPI/#dfn-Blob). La pregunta es: ¿es posible obtener el objeto JSON del Blob? Eché un vistazo a la interfaz FileReader (http://www.w3.org/TR/FileAPI/#FileReader-interface) y utilicé un código como este para inspeccionar lo que el FileReader puede hacer (la primera línea crea un Blob nuevo, para que pueda probar sobre la marcha si lo desea):

var b = new Blob([{"test": "toast"}], {type : "application/json"}); 
var fr = new FileReader(); 
fr.onload = function(evt) { 
    var res = evt.target.result; 
    console.log("onload",arguments, res, typeof res); 
}; 
fr.readAsArrayBuffer(b); 

usando todos los métodos "readAs ..." que vi en la implementación de File Reader (estoy usando Chrome 22). De todos modos, no encontré algo útil.

¿Tiene alguna sugerencia? Gracias.

+1

¿Cómo cree que se puede enviar JSON-secuencias como mensajes binarios? JSON es solo una codificación para objetos, y realmente no se puede enviar la estructura binaria dependiente de la implementación para evitar alguna función 'analizar'. – Bergi

+0

sí, tienes razón, no tiene ningún sentido. ¡Gracias! – Antonio

Respuesta

6

Lo que estás haciendo es conceptualmente incorrecto. JSON es una representación de cadena de un objeto, no un objeto en sí mismo. Entonces, cuando envía una representación binaria de JSON por cable, está enviando una representación binaria de la cadena. No hay forma de evitar el análisis de JSON en el lado del cliente para convertir una cadena JSON en un objeto JavaScript.

Siempre debe enviar siempre JSON como texto al cliente, y siempre debe llamar a JSON.parse. Nada más va a ser fácil para ti.

+0

Como le dije a Bergi, y como dijo al principio, la pregunta es conceptualmente incorrecta. Gracias. – Antonio

+0

¡Genial! Pude haber hecho la misma pregunta. –

1

Debería haber intentado readAsText() en lugar de readAsArrayBuffer() (JSON es texto al final).

También he echado de menos a stringify el objeto (convertir a texto JSON)

var b = new Blob([JSON.stringify({"test": "toast"})], {type : "application/json"}), 
    fr = new FileReader(); 

fr.onload = function() { 
    console.log(JSON.parse(this.result)) 
}; 

fr.readAsText(b);