对于此示例,假设我在表单中有一个月份列表,每个月份旁边都有一个复选框。我正在寻找帮助做两件事的任何一件事:
"January=on&March=on&September=on"
)或[{ 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插件(我想坚持使用ONLY jQuery)可以轻松地做到这一点,或者知道一个简单的方法来实现我正在寻找的结果?谢谢!
答案 0 :(得分:10)
您可以尝试
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"}})
答案 1 :(得分:3)
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();
假设您的文档类似于:
<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', ... }
答案 2 :(得分:0)
您可以使用$.each实用程序功能遍历对象图。
$(function() {
map = [{ January: 'on' },{ March: 'on' },{ September: 'on' }];
$.each(map, function() {
$.each(this, function(key, val) {alert(key + " = " + val);});;
});
});
第一个获取所有数组对象。使用第二个,您可以获得对象的关键和价值。
答案 3 :(得分:0)
我知道您正在尝试将查询字符串转换为JSON对象,但您可能有兴趣直接从html表单转到JSON对象(无需指定真正复杂的名称属性)。如果是这样,请查看JSONForms: http://code.google.com/p/jsonf/
免责声明:我开始了jsonforms项目。它还很年轻,但我个人觉得它很震撼!
答案 4 :(得分:0)
您还可以使用parseQuery plugin从序列化元素创建对象。
var contact = $.parseQuery($("#step1 *").serialize());