mwm*_*mwm 1 javascript json eval websocket
我有通过网络套接字发送的服务器消息.该消息是一个json(验证)字符串.当它到达浏览器时,我检查它是一个字符串,typeof(data)它告诉我它实际上是一个字符串.我最后这样做var some_obj = eval( '(' + data + ')' );
会给我一个Uncaught SyntaxError: Unexpected token ILLEGAL错误.
此外,在使用之前eval(),我console.log(data)和它显示正确,虽然alert(data)在对话框中不会显示任何内容.
我无法理解发生了什么.
我也试过var myJson = '{ "x": "Hello, World!", "y": [1, 2, 3] }';,然后var myObj = eval( '(' + myJson + ')' );它工作,所以我真的不明白为什么我的无法评估(解析).
通过web-socket接收的字符串是这样的:
received 37 bytes » { "cmd": "setname", "params": "ok" }
Run Code Online (Sandbox Code Playgroud)
where data = { "cmd": "setname", "params": "ok" }(我猜的typeof(data)是引号,因为是= string).
有小费吗?谢谢
edit1»使用web-socket,你必须添加一个空字符(0 ascii)并将一个转义字符(255 ascii)附加到服务器的输出字符串.我假设客户端(浏览器),因为它实现了Web套接字必须处理这个并正确打开字符串(作为标准)和我在我的服务器中.事情是,可能会有一些转义字符,并且它没有正确处理它.但问题只有在我试图将json字符串发送到eval()时才开始.否则他们像任何其他字符串一样正常工作
不,除了你可以使用的字符串"和'引用字符串之间没有区别,而不是在引用的字符串中"转义它,'反之亦然.但我不认为(你问题的标题)实际上与你所遇到的问题有关.
重新编辑,如果要确保字符串中没有值为0或255的字符,可以这样做:
data = data.replace(/[\u0000\u00ff]/g, '');
Run Code Online (Sandbox Code Playgroud)
......在传递之前eval.听起来你可能想要这样做,因为你的东西是说它收到了37个字节,但字符串只有36个字符长,并且不使用任何需要两个字节的字符(或者它最后只有一个空格我看不到).
偏离主题:最好不要使用eval反序列化JSON.而是使用直接处理它的库.Crockford eval在他的github页面上有两个不同的非libs ,一个(json_parse.js)使用递归下降解析器,另一个(json_parse_state.js)使用状态机.如果你真的,真的想用来eval解析JSON,请看看他在json2.js中的实现,至少需要几个步骤来清除恶意内容.
题外话题2:Re
where
data = { "cmd": "setname", "params": "ok" }(我猜的是引号,因为typeof(data)是= string).
我们只使用引号在代码中引用字符串文字; 内存中的实际字符串数据本身没有引号.如果我这样做:
var foo = "bar";
Run Code Online (Sandbox Code Playgroud)
... foo指向的字符串完全由字符b,a和r组成.没有引号; 引号只在代码中告诉解析器后面的内容是字符串文字.
| 归档时间: |
|
| 查看次数: |
878 次 |
| 最近记录: |