29

HTML5、WebSocket、およびファイル API を使用していくつかの実験を試みています。Tomcat7 WebSocket 実装を使用しています。サーブレットからテキスト メッセージを送受信できます。今やりたいことは、サーブレットからクライアントの JSON オブジェクトに送信することですが、クライアントで JSON.parse (または同様のもの) をスキップするためにテキスト メッセージを避けたいので、バイナリ メッセージを送信しようとしています。 . サーブレットの部分は非常に単純です。

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

このメッセージの後、クライアントで、Blob オブジェクト ( http://www.w3.org/TR/FileAPI/#dfn-Blob )に変換されたバイナリ フレームを受信したことがわかります。問題は、Blob から JSON オブジェクトを取得できるかどうかです。私は FileReader インターフェース ( http://www.w3.org/TR/FileAPI/#FileReader-interface ) を調べ、このようなコードを使用して FileReader で何ができるかを調べました (最初の行でまったく新しいブロブなので、必要に応じてオンザフライでテストできます):

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

ファイルリーダーの実装で見たすべての「readAs ...」メソッドを使用します(Chrome 22を使用しています)。とにかく、私は有用なものを見つけられませんでした。

何か提案はありましたか?ありがとう。

4

4 に答える 4

31

(JSONは最終的にテキストです)の代わりにreadAsText()を試したはずです。readAsArrayBuffer()

また、オブジェクトを文字列化することも忘れています (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);
于 2017-09-04T15:41:33.373 に答える
12

あなたがしていることは概念的に間違っています。JSON は、オブジェクト自体ではなく、オブジェクトの文字列表現です。したがって、JSON のバイナリ表現をネットワーク経由で送信すると、文字列のバイナリ表現が送信されます。JSON 文字列を JavaScript オブジェクトに変換するために、クライアント側で JSON を解析することを回避する方法はありません。

常に JSON をテキストとしてクライアントに送信する必要があり、常に JSON.parse を呼び出す必要があります。あなたにとって簡単なことは他にありません。

于 2012-10-08T20:45:23.547 に答える