与其担心输出数据不包含任何会导致 JSON 解析器出错的内容,不如考虑基于 HTTP RFC 参数解析的这种方法。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 编码的字符串。只需遍历对象的属性并按 key=value 进行,用 & 连接所有元素。