我有一条通过网络套接字发送的服务器消息。该消息是一个 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" }
where data = { "cmd": "setname", "params": "ok"}
(我想有引号,因为 typeof(data)
是= 字符串)。
有什么建议吗?谢谢
edit1 » 对于网络套接字,您必须在服务器的输出字符串中添加一个空字符 (0 ascii) 并附加一个转义字符 (255 ascii)。我假设客户端(浏览器)在实现网络套接字时必须处理这个问题并正确解包字符串(作为标准),就像我在我的服务器中所做的那样。问题是,可能还剩下一些转义字符,但无法正确处理。但问题仅在我尝试发送 json 字符串进行评估时才开始()。否则它们可以像任何其他字符串一样正常工作。
最佳答案
不,"
和 '
之间的引用字符串没有区别,除了你可以使用 "
而无需在引用的字符串中转义它与 '
反之亦然。但我认为(你的问题的标题)实际上与你遇到的问题没有任何关系。
重新编辑,如果要确保字符串中没有值为 0 或 255 的字符,可以这样做:
data = data.replace(/[\u0000\u00ff]/g, '');
...在将其传递给 eval
之前。听起来你可能想要这样做,因为你的意思是它收到了 37 个字节,但字符串只有 36 个字符长,并且不使用任何需要两个字节的字符(或者它可能只是在末尾有一个空格 I看不到)。
题外话:最好不要使用eval
反序列化JSON。相反,使用直接处理它的库。 Crockford 在 his github page 上有两个不同的非eval
库,一个 (json_parse.js) 使用递归下降解析器,另一个 (json_parse_state.js) 使用状态机。如果您真的非常想使用 eval
来解析 JSON,请查看他在 json2.js 中的实现,它至少需要几个步骤来清除恶意内容。
题外话2:回复
where
data = { "cmd": "setname", "params": "ok" }
(with quotes i suppose, because of typeof(data) being = string).
我们只在代码中使用引号来引用字符串文字;内存中的实际字符串数据本身没有引号。如果我这样做:
var foo = "bar";
...foo
指向的字符串完全由字符 b、a 和 r 组成。没有引号;引号仅在代码中存在,用于告诉解析器后面是字符串文字。
关于javascript - 传递给 javascript 的 eval 的单引号/双引号字符串之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484195/