如何使用jQuery将查询字符串或JSON对象映射转换为单个JSON对象?

对于此示例,假设我在表单中有一个月份列表,每个月份旁边都有一个复选框。 我正在寻找帮助做两件事情中的任何一件事:

  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').serializeArray(); 我可以使用$('form').serialize();构建查询字符串$('form').serialize();

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

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

这就是我可以处理第一个或第二个答案的原因。

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

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

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

你可以试试这个

 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"}}) 

kgiannakakis建议穿越地图是一个很好的起点,虽然我觉得它不符合我原来问题的答案。 经过几个小时的敲击,我决定这样做,这允许你根据自定义属性序列化元素(我不想满足于在我的表单元素上使用’name’属性,jQuery需要)。 我也开始使用json.org的JSON库来对我创建的对象进行字符串化。 我的插件的serializeToJSON函数是我正在寻找的问题的答案,其余的只是exta。

注意 :这是针对客户端的,因此’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(); 

假设您的文档类似于:

 
January
February
...

构建的JSON看起来像:

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

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

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

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

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

免责声明:我开始了jsonforms项目。 它还很年轻,但我个人觉得它很棒!

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

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