我有通过网络套接字发送的服务器消息。该消息是一个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 + ')' );
并且它有效,所以我真的无法理解为什么我的无法被评估(解析)。
通过网络套接字收到的字符串是:
received 37 bytes » { "cmd": "setname", "params": "ok" }
其中data = { "cmd": "setname", "params": "ok" }
(我猜是引号,因为typeof(data)
是= string)。
任何提示?感谢
edit1»使用web-socket,你必须添加一个空字符(0 ascii)并将一个转义字符(255 ascii)附加到服务器的输出字符串。我假设客户端(浏览器),因为它实现了Web套接字必须处理这个并正确打开字符串(作为标准)和我在我的服务器中。事情是,可能会有一些转义字符,并且它没有正确处理它。但问题只有在我试图将json字符串发送到eval()时才开始。否则它们可以像任何其他字符串一样正常工作。
答案 0 :(得分:6)
不,"
和'
引用字符串之间没有区别,除了您可以使用"
而不在'
引用的字符串中转义字符串反之亦然。但我不认为(你问题的标题)实际上与你所遇到的问题有关。
重新编辑,如果你想确保字符串中没有值为0或255的字符,你可以这样做:
data = data.replace(/[\u0000\u00ff]/g, '');
...然后将其传递给eval
。听起来你可能想要这样做,因为你的东西是说它收到了37个字节,但字符串只有36个字符长,并且不使用任何需要两个字节的字符(或者它最后只有一个空格我看不到)。
偏离主题:最好不要使用eval
反序列化JSON。而是使用直接处理它的库。 Crockford在his github page上有两个不同的非eval
库,一个(json_parse.js)使用递归下降解析器,另一个(json_parse_state.js)使用状态机。如果你真的,真的想用eval
来解析JSON,请看看他在json2.js中的实现,至少需要几个步骤来清除恶意内容。
非主题2 :重新
其中
data = { "cmd": "setname", "params": "ok" }
(我猜的是引号,因为typeof(data)是= string)。
我们只使用引号在代码中引用字符串文字;内存中的实际字符串数据本身没有引号。如果我这样做:
var foo = "bar";
... foo
指向的字符串完全由字符b,a和r组成。没有引号;引号只在代码中告诉解析器后面的内容是字符串文字。