问题 文件API - Blob到JSON


我正在尝试使用HTML5,WebSocket和File API进行一些实验。 我正在使用Tomcat7 WebSocket实现。 我能够从servlet发送和接收短信。我现在要做的是从servlet发送到客户端JSON对象,但我想避免文本消息,以便跳过客户端上的JSON.parse(或类似),所以我试图发送二进制消息。 servlet部分非常简单:

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可以做什么(第一行创建一个全新的Blob,所以你可以随时测试):

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

使用我在File Reader实现中看到的所有“readAs ...”方法(我使用的是Chrome 22)。无论如何,我没有找到有用的东西。

你有什么建议吗?谢谢。


11103
2017-10-08 17:45


起源

您认为如何将JSON字符串作为二进制消息发送? JSON只是对象的一种编码,你无法真正发送依赖于实现的二进制结构 parse 功能。 - Bergi
是的你是对的,没有任何意义。谢谢! - Antonio


答案:


你在做什么在概念上是错误的。 JSON是对象的字符串表示形式,而不是对象本身。因此,当您通过线路发送JSON的二进制表示时,您将发送该字符串的二进制表示。没有办法在客户端解析JSON以将JSON字符串转换为JavaScript对象。

您绝对应该始终将JSON作为文本发送到客户端,并且您应该始终调用JSON.parse。没有别的事情对你来说很容易。


7
2017-10-08 20:45



正如我对Bergi所说,正如你在开头所说,这个问题在概念上是错误的。谢谢。 - Antonio
凉!我本可以问同样的问题。 - Franz Noel


你应该试过 readAsText() 代替 readAsArrayBuffer() (JSON最后是文本)。

您还错过了对对象进行字符串化(转换为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);

6
2017-09-04 15:41