2012-10-08 15 views
8

Ich versuche, etwas experimentieren mit HTML5, WebSocket und File API. Ich verwende die Tomcat7 WebSocket-Implementierung. Ich kann Textnachrichten vom Servlet senden und empfangen. Ich möchte jetzt vom Servlet zum Client JSON-Objekte senden, aber ich möchte Textnachrichten vermeiden, um JSON.parse (oder Ähnliches) auf dem Client zu überspringen, also versuche ich, binäre Nachrichten zu senden . Das Servlet Teil ist wirklich einfach:Datei-API - Blob zu 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(); 

Nach dieser Nachricht auf dem Client ich sehe, dass ich einen binären Frame empfangen, das zu einem Blob-Objekt umgewandelt wird (http://www.w3.org/TR/FileAPI/#dfn-Blob). Die Frage ist: ist es möglich, das JSON-Objekt aus dem Blob zu bekommen? Ich schaute auf die FileReader-Schnittstelle (http://www.w3.org/TR/FileAPI/#FileReader-interface), und ich habe Code wie folgt verwendet, um zu sehen, was der FileReader tun kann (die erste Zeile erstellt einen brandneuen Blob, so dass Sie on-the-fly testen können):

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); 

mit allen "readAs ..." Methoden, die ich auf der File Reader-Implementierung sah (ich verwende Chrome 22). Jedenfalls habe ich nichts Nützliches gefunden.

Hatten Sie einen Vorschlag? Vielen Dank.

+1

Wie denken Sie, Sie JSON-Strings als binäre Nachrichten senden können? JSON ist nur eine Kodierung für Objekte, und Sie können die implementierungsabhängige Binärstruktur nicht wirklich um eine "Parse" -Funktion herum senden. – Bergi

+0

ja du hast Recht, es ergibt keinen Sinn. Vielen Dank! – Antonio

Antwort

6

Was Sie tun, ist konzeptionell falsch. JSON ist eine Zeichenfolgendarstellung eines Objekts, kein Objekt selbst. Wenn Sie also eine Binärdarstellung von JSON über die Verbindung senden, senden Sie eine Binärdarstellung der Zeichenfolge. Es gibt keine Möglichkeit, JSON auf der Clientseite zu analysieren, um eine JSON-Zeichenfolge in ein JavaScript-Objekt zu konvertieren.

Sie sollten unbedingt immer JSON als Text an den Client senden, und Sie sollten JSON.parse immer aufrufen. Nichts wird für dich einfach sein.

+0

Wie ich zu Bergi gesagt habe, und wie Sie zu Beginn gesagt haben, ist die Frage konzeptionell falsch. Vielen Dank. – Antonio

+0

Cool! Ich hätte dieselbe Frage stellen können. –

1

Sie sollten readAsText() anstelle von readAsArrayBuffer() versucht haben (JSON ist Text am Ende).

Sie haben auch verpasst, das Objekt stringify (JSON Text konvertieren)

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);