Ich versuche, mit HTML5, WebSocket und File API zu experimentieren. Ich verwende die Tomcat7 WebSocket-Implementierung. Ich kann Textnachrichten vom Servlet senden und empfangen. Was ich jetzt tun möchte, ist, vom Servlet an die Client-JSON-Objekte zu senden, aber ich möchte Textnachrichten vermeiden, um die JSON.parse (oder ähnliches) auf dem Client zu überspringen, also versuche ich, Binärnachrichten zu senden . Der Servlet-Teil ist wirklich einfach:

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 sehe ich auf dem Client, dass ich einen Binärrahmen erhalten habe, der in ein Blob-Objekt konvertiert wurde (http://www.w3.org/TR/FileAPI/#dfn-Blob). Die Frage ist: Ist es möglich, das JSON-Objekt vom Blob abzurufen? Ich habe mir die FileReader-Oberfläche angesehen (http://www.w3.org/TR) / FileAPI / # FileReader-Schnittstelle), und ich habe Code wie diesen verwendet, um zu überprüfen, was der FileReader kann (in der ersten Zeile wird ein brandneuer Blob erstellt, sodass Sie ihn im laufenden Betrieb testen können, wenn Sie möchten):

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

Verwenden aller "readAs ..." - Methoden, die ich in der File Reader-Implementierung gesehen habe (ich verwende Chrome 22). Jedenfalls fand ich nichts Nützliches.

Hattest du einen Vorschlag? Vielen Dank.

22
Antonio 8 Okt. 2012 im 21:45

3 Antworten

Beste Antwort

Was Sie tun, ist konzeptionell falsch. JSON ist eine Zeichenfolgendarstellung eines Objekts, nicht eines Objekts. Wenn Sie also eine binäre Darstellung von JSON über die Leitung senden, senden Sie eine binäre Darstellung 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 JSON unbedingt immer als Text an den Client senden und immer JSON.parse aufrufen. Nichts anderes wird Ihnen leicht fallen.

10
saml 8 Okt. 2012 im 20:45
let reader = new FileReader()
      reader.onload = e => {
        if (e.target.readyState === 2) {
          let res = {}
          if (window.TextDecoder) {
            const enc = new TextDecoder('utf-8')
            res = JSON.parse(enc.decode(new Uint8Array(e.target.result))) //转化成json对象
          } else {
            res = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(e.target.result)))
          }

          console.info('import-back:: ', res)


        }
      }

      reader.readAsArrayBuffer(response)
1
sanshuiwang 13 Apr. 2019 im 08:27

Sie sollten readAsText () anstelle von {{ X0}} (JSON ist am Ende Text).

Sie haben auch versäumt, das Objekt zu stringifizieren (in 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);
16
qdev 4 Sept. 2017 im 15:41