Oracle将表数据转成json数据,将JavaScript的jQuery库中表单转化为JSON对象的方法

大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法。不过,我们可以写一个插件实现。

我在网上看到有人用替换的方法,先用serialize序列化后,将&替换成“:”、“‘”:

/**

* 重置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;

}

/**

* 重置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。

我的方法是,先用serializeArray序列化为数组,再封装为Json对象。

下面是表单:

< form id = "myForm" action = "#" >

< input name = "name" />

< input name = "age" />

< input type = "submit" />

form >

Jquery插件代码如下:

( function ($){

$.fn.serializeJson= function (){

var serializeObj={};

$( this .serializeArray()).each( function (){

serializeObj[ this .name]= this .value;

});

return serializeObj;

};

})(jQuery);

(function($){

$.fn.serializeJson=function(){

var serializeObj={};

$(this.serializeArray()).each(function(){

serializeObj[this.name]=this.value;

});

return serializeObj;

};

})(jQuery);

下面测试一下:

$("#myForm").bind("submit",function(e){

e.preventDefault();

console.log($( this ).serializeJson());

});

e.preventDefault();

console.log($(this).serializeJson());

});

测试结果:

输入a,b提交,得到序列化结果

{age: "b",name: "a"}

上面的插件,不能适用于有多个值的输入控件,例如复选框、多选的select。下面,我将插件做进一步的修改,让其支持多选。代码如下:

( 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);

(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);

这里,我将多选的值封装为一个数值来进行处理。如果大家使用的时候需要将多选的值封装为“,"连接的字符串或者其他形式,请自行修改相应代码。

测试如下:

表单:

< form id = "myForm" action = "#" >

< input name = "name" />

< input name = "age" />

< select multiple = "multiple" name = "interest" size = "2" >

< option value = "interest1" > interest1 option >

< option value = "interest2" > interest2 option >

< option value = "interest3" > interest3 option >

< option value = "interest4" > interest4 option >

select >

< input type = "checkbox" name = "vehicle" value = "Bike" /> I have a bike

< input type = "checkbox" name = "vehicle" value = "Car" /> I have a car

< input type = "submit" />

form >

interest1

interest2

interest3

interest4

I have a bike

I have a car

测试结果:

{age: "aa",interest: ["interest2", "interest4"],name: "dd",vehicle:["Bike","Car"]}

处理序列化时的空格问题

jquery的 serialize()方法,可以对表单项进行序列化,这本来是很方便的一个功能;但是实际使用中有时会出现如下问题:

例如

在执行 serialize()方法后,得到的却是  ddd+567这样的字符串;即jquery的序列化方法对空格进行了转义,转换成了 + 号。

解决方法

由于serialize()方法对真正的“+”号转义的是 %2B,所以可以对serialize()后的结果进行符号替换。

例如

var a= $('$frm1').serialize(); //序列化,默认会调用encodeURIComponent()进行编码

alert(a); // content=ddd+++567+++987

var b = a.replace(/\\+/g," "); // g表示对整个字符串中符合条件的都进行替换

b = decodeURIComponent(b); //对serialize后的内容进行解码

alert(b); // content=ddd + 567 + 987

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值