在发出 jQuery AJAX 请求后,我收到“无效 JSON”。这个请求代码并不重要,所以我选择省略它。
我深入研究了 jQuery 库并删除了相关代码,这些代码汇总到下面的代码片段中。
那么,鉴于我的请求返回一个字符串“{'x':'1'}
”,为什么在处理它的过程中,jQuery 返回“{'x'” :']'}
"?
//regex values stripped from jQuery 1.5.2.
var data = "{'x':'1'}";
var rvalidchars = /^[\],:{}\s]*$/;
var rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
var rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
var rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g;
//test the various stages of data.replace from the jQuery library
alert (data.replace(rvalidescape, "@")); // {'x':'1'}"
alert (data.replace(rvalidescape, "@").replace(rvalidtokens, "]")); //{'x':']'}"
alert (data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, "")); //{'x':']'}"
您可以在 this JSFiddle 看到它
此外,还会发生以下转换:
'{x:12}' --> '{x:]}'
'{"x":"12"}' --> '{],]}'
我猜有人可以向我解释为什么正则表达式会这样做,但我也很好奇为什么 jQuery 会这样做。
任何帮助将不胜感激
最佳答案
从表面上看,jQuery 正在用“]”替换任何不是有效 JSON 标记的内容。有些内容,如 'null'、'true'、'false' 等可以不带引号插入。事实上,数字也可以!
您的 JSON 无效,因为您需要对值使用双引号。所以要么:
{"x": 1}
或
{"x": "1"}
应该可以工作。您复制的代码仍然会破坏这一点,但通过 jQuery.parseJSON() 抛出它对我来说效果很好。
关于javascript - jQuery 中的正则表达式困惑 (1.5.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702935/