我有一个网站,我使用AJAX。我遇到了一些问题。
服务器返回类似于此{a:"x48\x65\x6C\x6C\x6F"}
的JSON字符串。
然后在xx.responseText
中,我们有了这个字符串'{a:"\x48\x65\x6C\x6C\x6F"}'
。
但是,如果我创建JavaScript字符串"\x48\x65\x6C\x6C\x6F"
,那么我有"Hello"
而不是HEX!
是否可以从HEX获取xx.responseText
“真实”文本(自动,没有.replace()
)?
答案 0 :(得分:2)
如果输出完全常规(可预测),.replace()
可能是最简单的。
var escapeSequences = xx.responseText.replace(/^\{a:/, '').replace(/\}$/, '');
console.log(escapeSequences === "\"\\x48\\x65\\x6C\\x6C\\x6F\""); // true
或者,如果字符串文字的值相等但可能不相同,则可以解析(见下文),然后stringify()
个别属性。
console.log(JSON.stringify(data.a) === "\"Hello\""); // true
否则,您可能需要通过lexer运行responseText
来对其进行标记并从中检索文字。 JavaScript不包含与解析/评估分开的选项,因此您需要为此找到一个库。
“Lexer written in JavaScript?”可能是一个很好的起点。
解析它:
由于它似乎是一串代码,因此您可能必须使用eval()
。
var data = eval('(' + xx.responseText + ')');
console.log(data.a); // Hello
注意:括号中请确保将{...}
评估为Object
literal而不是block。
此外,我建议寻找代码来替代这样的数据。
常见选项是JSON
,它从JavaScript获取其语法,但使用了相当严格的子集。它不允许包含function
或其他可能存在问题的代码。
var data = JSON.parse(xx.responseText);
console.log(data.a); // Hello
访问JSON.org,你应该能够找到一个参考或库来选择服务器端语言来输出JSON。
{ "a": "Hello" }
答案 1 :(得分:1)
为什么不让JSON解析器完成它的工作并处理\x
转义序列,然后再将字符串转换回十六进制,例如。
function charToHex(c) {
var hex = c.charCodeAt(0).toString(16);
return (hex.length === 2) ? hex : '0' + hex;
}
"Hello".replace(/./g, charToHex); // gives "48656c6c6f"