【问题标题】:Represent a query string in JSON用 JSON 表示一个查询字符串
【发布时间】:2009-01-15 19:36:34
【问题描述】:

我有这个 Javascript 数据:

[{id:123,type:"test"},{id:154,type:"another"}]

您如何将其转换为某种东西,以便我可以将其作为 HTTP 发布请求传递?

menu[0][id] = 123
menu[0][type] = test
menu[1][id] = 154
menu[1][type] = another

我不想传递实际的 JSON 数据,我想清理它并将其作为格式化的 HTTP 参数传递。

编辑

能够使用类似这样的方法在客户端解析对象,也许你们会在我将其签名为“已回答”之前提出更好的建议?

this.serialize = function(elem) {
    var childs = elem.childElements();
    var str = "";
    for(var i=0, item; i<childs.length; i++) {
        item = childs[i];
        str += ((i)?"&":"")+"menu[" + i +"][id]=" + item.id.replace(/item_/,"");
        str += "&menu[" + i +"][type]=" + item.className;
        str += "&menu[" + i +"][section]=" + elem.id;
        str += "&menu[" + i +"][position]=" + i;
    }
    return str;
}

【问题讨论】:

  • 您在寻找查询参数必须采用的语法吗?

标签: javascript json query-string


【解决方案1】:
var data = [{id:123,type:"test"},{id:154,type:"another"}];
var params = new Array();
for(var x = 0; x < data.length; x++) {
    params.push("id=[" + x + "]=" + escape(data[x].id));
    params.push("type=[" + x + "]=" + escape(data[x].type));
}
alert(params.join("&")); // output: id=[0]=123&type=[0]=test&id=[1]=154&type=[1]=another

这是你想要的吗?

【讨论】:

  • 哦,很好,谢谢,类似于我的解决方案,我会标记你问的问题。
  • 小心,您不应该使用 for(x in obj) 来迭代 javascript 数组。我相信它在 IE 中会中断,请使用 for(var i=0 ...);跨度>
  • 不是只有当人们弄乱原型时才会崩溃吗?
  • 我知道如果加载了“原型”库,它会中断。
  • @LucaMatteis 内部属性也是迭代的,如果您在 Object.prototype 上有任何垫片,这也是一个问题。您可以添加 Object.hasOwnProperty(instance) 作为任何一种情况的健全性检查。
【解决方案2】:

menu0.id=123&menu0.type=test&menu1.id=154&menu1.type=another

这在服务器上很容易解析,因为它是一种常规格式。

【讨论】:

    【解决方案3】:

    我相信 HTTP POST 只接受一个平面键/值集合,而不是任何任意的 JavaScript 数据结构。

    如果您可以将其展平(例如,像 John Stauffer 的节目),并且如果您要发布到自己的域,则可以使用 XMLHttpRequest 发布并传递密钥/值集合,格式类似于查询字符串,使用 .send(data) 方法。

    如果您不想自己实现它,大多数 JavaScript 库都应该有一个实现(例如 jQuery.post)。

    【讨论】:

      【解决方案4】:
      "?qsparam=" + escape("[{id:123,type:'test'},{id:154,type:'another'},...]")
      

      【讨论】:

      • 你可能错过了理解我的问题,无论如何这是错误的,我不想传递实际的 JSON 数据,我想清理它并将其作为格式化的 HTTP 参数传递。
      猜你喜欢
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多