【问题标题】:How can I convert query string or JSON object map to single JSON object with jQuery?如何使用 jQuery 将查询字符串或 JSON 对象映射转换为单个 JSON 对象?
【发布时间】:2009-04-25 21:23:38
【问题描述】:

对于这个例子,假设我有一个表格中的月份列表,每个月份旁边都有一个复选框。我正在寻求帮助做以下两件事:

  1. 转换查询字符串(例如"January=on&March=on&September=on")或
  2. 转换对象映射:[{ January: 'on' },{ March: 'on' },{ September: 'on' }]

到单个 JSON 对象:{ January: 'on', March: 'on', September: 'on' }

我意识到第一个映射已经是 JSON,但我希望它不是对象数组,而是单个 JSON 对象。我可以用$('form').serializeArray(); 构建地图,也可以用$('form').serialize(); 构建查询字符串。

jQuery API 中 .serialize() 的实现很简单:

serialize: function() {
    return jQuery.param(this.serializeArray());
},

这就是为什么我可以处理第一个或第二个答案。

我想这样做的原因是因为我正在从 PrototypeJS 切换到 jQuery,而在 PrototypeJS 中这很简单:

Object.toJSON(Form.serializeElements($('myform'), true));

那么,有没有人知道可以轻松做到这一点的 JSON 插件(我只想坚持使用 jQuery),或者知道实现我正在寻找的结果的简单方法?谢谢!

【问题讨论】:

    标签: jquery json query-string


    【解决方案1】:

    你可以试试这个

    String.prototype.QueryStringToJSON = function () {
    href = this;
    qStr = href.replace(/(.*?\?)/, '');
    qArr = qStr.split('&');
    stack = {};
    for (var i in qArr) {
        var a = qArr[i].split('=');
        var name = a[0],
            value = isNaN(a[1]) ? a[1] : parseFloat(a[1]);
        if (name.match(/(.*?)\[(.*?)]/)) {
            name = RegExp.$1;
            name2 = RegExp.$2;
            //alert(RegExp.$2)
            if (name2) {
                if (!(name in stack)) {
                    stack[name] = {};
                }
                stack[name][name2] = value;
            } else {
                if (!(name in stack)) {
                    stack[name] = [];
                }
                stack[name].push(value);
            }
        } else {
            stack[name] = value;
        }
    }
    return stack;
    }
    

    查询字符串

        href="j.html?name=nayan&age=29&salary=20000&interest[]=php&interest[]=jquery&interest[1]=python&interest[2]=Csharp&fan[friend]=rangan&fan[family]=sujan&sports[1]=cricket&sports[2]=football";
    

    用法

    alert(href.QueryStringToJSON().toSource())
    

    输出

    ({name:"nayan", age:29, salary:20000, interest:["php", "python", "Csharp"], fan:{friend:"rangan", family:"sujan"}, sports:{1:"cricket", 2:"football"}})
    

    【讨论】:

      【解决方案2】:

      kgiannakakis 的遍历地图的建议是一个很好的起点,尽管我认为它不能作为对我最初问题的回答。经过几个小时的头撞后,我解决了这个问题,它允许您基于自定义属性序列化元素(我不想满足于必须在我的表单元素上使用 'name' 属性,这是 jQuery 要求的)。我还开始使用来自 json.org 的 JSON 库来对我创建的对象进行字符串化。我的插件的 serializeToJSON 功能是我一直在寻找的问题的答案,其余的只是额外的。

      注意:这是针对客户端的,因此“CustomXXX”名称和属性已替换为实际内容

      jQuery.fn.extend({
          serializeCustomPropertyArray: function() {
              return this.map(function() {
                  return this.elements ? jQuery.makeArray(this.elements) : this;
              }).filter(function() {
                  return jQuery(this).attr('CustomAttribute') &&
                      (this.checked || /select|textarea/i.test(this.nodeName) ||
                              /text|hidden|password|search/i.test(this.type));
              }).map(function(i, elem) {
                  var val = jQuery(this).val();
                  return val == null ? null : jQuery.isArray(val) ?
                      jQuery.map(val, function(val, i) {
                          return { name: jQuery(elem).attr('CustomAttribute'), value: val };
                      }) : { name: jQuery(elem).attr('CustomAttribute'), value: val };
              }).get();
          },
          serializeToJSON: function() {
              var objectMap = this.serializeCustomPropertyArray();
              var objectJson = new Object;
              jQuery.each(objectMap, function() {
                  objectJson[this.name] = (this.value !== null) ? this.value : 'null';
              });
              return JSON.stringify(objectJson);
          }
      });
      

      这可以这样调用:

      $('#fields').find(':input[CustomGroup="Months"]').serializeToJSON();
      

      假设您的文档如下所示:

      <div id="fields">
         <input type="checkbox" CustomGroup="Months" CustomAttribute="January" />January<br />
         <input type="checkbox" CustomGroup="Months" CustomAttribute="February" />February<br />
         ...
      </div>
      

      构建的 JSON 如下所示:

      { January: 'on', February: 'on', ... }
      

      【讨论】:

        【解决方案3】:

        您可以使用$.each 实用函数遍历对象映射。

        $(function() {
            map = [{ January: 'on' },{ March: 'on' },{ September: 'on' }];
            $.each(map, function() {
               $.each(this, function(key, val) {alert(key + " = " + val);});;
            });
        });
        

        第一个 each 获取所有数组对象。使用第二个,您可以获得对象的键和值。

        【讨论】:

        • 我认为这是一个好的开始——至少我可以使用它。地图中的每个对象都可以同名的情况如何?这不完全是一个要求,但是如果将来出现这种情况,我想处理它。复杂性似乎随之增加了很多。我会以你的例子开始做一些事情......
        【解决方案4】:

        我知道您正在尝试将查询字符串转换为 JSON 对象,但也许您可能对直接从 html 表单转换为 JSON 对象感兴趣(无需指定非常复杂的名称属性)。如果是这样,请查看 JSONForms: http://code.google.com/p/jsonf/

        免责声明:我开始了 jsonforms 项目。它还很年轻,但我个人认为它很摇滚!

        【讨论】:

        • 这很酷,但不能解决问题。我使用的是 ASP.NET,因此通过在任何地方都有 NamingContainers 来完成所有名称修改,您的库将不会创建非常友好的对象属性名称。
        【解决方案5】:

        您还可以使用parseQuery plugin 从序列化元素创建对象。

        var contact = $.parseQuery($("#step1 *").serialize());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-27
          相关资源
          最近更新 更多