[origin](http://www.cnblogs.com/hyl8218/archive/2013/06/27/3159178.html) 大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法。不过,我们可以写一个插件实现。 我在网上看到有人用替换的方法,先用serialize序列化后,将&替换成“:”、“‘”: ```javascript /** * 重置form表单 * @param formId form的id */ function resetQuery(formId){ var fid = "#" + formId; var str = $(fid).serialize(); //str= cardSelectDate=3&startdate=2012-02-01&enddate=2012-02-04 var ob= strToObj(str); alert(ob.startdate);//2012-02-01 } function strToObj(str){ str = str.replace(/&/g,"','"); str = str.replace(/=/g,"':'"); str = "({'"+str +"'})"; obj = eval(str); return obj; } ``` 个人感觉这样做有bug。 > (PS我用的时候确实有bug,首先serailize()会自动调encodeURIComponent将数据编码,所以中文就会变成乱码(URL采用ASCII编码),所以还需要再调用decodeURIComponent(str,true)。) 我的方法是,先用serializeArray序列化为数组,再封装为Json对象。 Jquery插件代码如下: ```javascript (function($){ $.fn.serializeJson=function(){ var serializeObj={}; $(this.serializeArray()).each(function(){ serializeObj[this.name]=this.value; }); return serializeObj; }; })(jQuery); ``` 上面的插件,不能适用于有多个值的输入控件,例如复选框、多选的select。下面,我将插件做进一步的修改,让其支持多选。代码如下: ```javascript (function($){ $.fn.serializeJson=function(){ var serializeObj={}; var array=this.serializeArray(); var str=this.serialize(); $(array).each(function(){ if(serializeObj[this.name]){ if($.isArray(serializeObj[this.name])){ serializeObj[this.name].push(this.value); }else{ serializeObj[this.name]=[serializeObj[this.name],this.value]; } }else{ serializeObj[this.name]=this.value; } }); return serializeObj; }; })(jQuery); ``` 这里,我将多选的值封装为一个数值来进行处理。如果大家使用的时候需要将多选的值封装为“,"连接的字符串或者其他形式,请自行修改相应代码。 测试表单: ```html interest1 interest2 interest3 interest4 I have a bike I have a car ``` 测试结果: {age: "aa",interest: ["interest2", "interest4"],name: "dd",vehicle:["Bike","Car"]}