我正在逃避&和=在解析为这样的对象之前:
var obb = parseJSON('{"' + text.replace(/&/g, "\",\"").replace(/=/g,"\":\"") + '"}');
当创建对象时,我得到:
obb.name
obb.date
obb.text
在obb.text中我想恢复上面的转义..
我试过了:
text.replace(/\&/g, "&").replace(/\=/g, "=")
当我在obb.text
上运行以下内容时obb.text = decodeURIComponent(escape(obb.text));
我得到解析错误
但似乎不起作用
有什么想法吗?
答案 0 :(得分:2)
请注意,此方法基于HTTP RFC参数解析,而不是保持手指交叉,输出数据不包含任何会导致JSON解析器陷入困境的内容。 RFC RFC(2616)规定了以下规则:
他们还暂时提出以下规则,我将为您提供以下选择: - 如果提交了一个没有[]的参数会覆盖它以前的版本(顺便说一下,所有的网络服务器都没有这个,而且就像HTTP碎片/污染攻击一样)
我们将按照这个确切的结构进行解析,假设这些东西已被正确地进行字符编码。代码的开头应如下所示:
var myObj = {};
var k = myPostbackContent.split("&");
for (var i = 0; i < k.length; i++) {
var kinfo = k[i].split("=");
var key = kinfo[0];
if (kinfo[1] !== undefined) {
var value = kinfo[1];
};
if (key.substr(-2) == "[]") {
key = key.substr(0,key.length-2);
if (myObj[key] === undefined) myObj[key] = [];
if (myObj[key] instanceof Array) myObj[key].push(value);
}
else {
以下部分取决于您的假设:
如果您希望自己的元素互相覆盖,请输入else
以下版本:
myObj[key] = value;
相反,如果您希望第一个元素实例具有优先权,请输入以下内容:
if (myObj[key] === undefined) myObj[key] = value;
如果像IIS一样,您希望将元素自动附加到由,
分隔的字符串,请使用以下命令:
if (myObj[key].length) myObj[key] += ",";
myObj[key] += value;
我已经构建了一个小的 TinkerIO 脚本来向您展示这三个是如何工作的。如果这不是您想要的,请告诉我。顺便说一下,默认行为是“覆盖”。
顺便说一句,这个方法可以反过来从一个对象转到一个URI编码的字符串。只需循环访问对象的属性,然后按键=值,将所有元素与&amp ;.
连接起来。答案 1 :(得分:1)
只要您的text参数始终位于字符串的末尾,您就可以执行以下操作:
var obb = {};
obb.name = text.match(/name=([^&]+)/)[1];
obb.date = text.match(/date=([^&]+)/)[1];
obb.text = text.match(/text=(.+)/)[1];