基于jQuery的一个扩展form序列化到json对象


Posted in Javascript onDecember 09, 2010
$.fn.serializeObject = function() { 
var o = {}; 
var a = this.serializeArray(); 
$.each(a, function() { 
if (o[this.name]) { 
if (!o[this.name].push) { 
o[this.name] = [ o[this.name] ]; 
} 
o[this.name].push(this.value || ''); 
} else { 
o[this.name] = this.value || ''; 
} 
}); 
return o; 
}

这个function对于普通的对象转换是足够的,但是如果出现对象内部又包含子对象的情形就不能支持了。
例如我有这样的一个form表单:
<form id="testform"> 
<input type="text" name="name" value="dummyName" id="name"> 
<input type="text" name="category.id" value="categoryId" id="name"> 
<input type="text" name="category.name" value="categoryName" id="name"> 
</form>

对应到server端上的domain class是这样的:
public class DummyProduct { private DummyCategory category; 
private String name; 
public DummyCategory getCategory() { 
return category; 
} 
public void setCategory(DummyCategory category) { 
this.category = category; 
} 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
} 
public class DummyCategory { 
private String id; 
private String name; 
public String getId() { 
return id; 
} 
public void setId(String id) { 
this.id = id; 
} 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
}

如果想把表单数据序列化成跟server端domain class匹配的json字符串,就可以使用我下面的这个扩展
/** @serializedParams looks like "prop1=value1&prop2=value2".   
Nested property like 'prop.subprop=value' is also supported **/ 
function paramString2obj (serializedParams) { var obj={}; 
function evalThem (str) { 
var attributeName = str.split("=")[0]; 
var attributeValue = str.split("=")[1]; 
if(!attributeValue){ 
return ; 
} 
var array = attributeName.split("."); 
for (var i = 1; i < array.length; i++) { 
var tmpArray = Array(); 
tmpArray.push("obj"); 
for (var j = 0; j < i; j++) { 
tmpArray.push(array[j]); 
}; 
var evalString = tmpArray.join("."); 
// alert(evalString); 
if(!eval(evalString)){ 
eval(evalString+"={};"); 
} 
}; 
eval("obj."+attributeName+"='"+attributeValue+"';"); 
}; 
var properties = serializedParams.split("&"); 
for (var i = 0; i < properties.length; i++) { 
evalThem(properties[i]); 
}; 
return obj; 
} 
$.fn.form2json = function(){ 
var serializedParams = this.serialize(); 
var obj = paramString2obj(serializedParams); 
return JSON.stringify(obj); 
}

使用起来大概像这个样子:
var json = $("#testform").form2json(); 
alert(json);
Javascript 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
jquery之Document元素选择器篇
Aug 14 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
Aug 09 Javascript
js 用CreateElement动态创建标签示例
Nov 20 Javascript
使用CSS样式position:fixed水平滚动的方法
Feb 19 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
Oct 29 Javascript
javascript实现tab切换的两个实例
Nov 05 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
Nov 25 Javascript
vue实现todolist单页面应用
Apr 11 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 jQuery
vue + axios get下载文件功能
Sep 25 Javascript
JS不要再到处使用绝对等于运算符了
Apr 30 Javascript
来自国外的页面JavaScript文件优化
Dec 08 #Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
Dec 08 #Javascript
javascript中callee与caller的用法和应用场景
Dec 08 #Javascript
js下通过prototype扩展实现indexOf的代码
Dec 08 #Javascript
在JQuery dialog里的服务器控件 事件失效问题
Dec 08 #Javascript
jquery蒙版控件实现代码
Dec 08 #Javascript
基于JQuery制作的产品广告效果
Dec 08 #Javascript
You might like
php简单静态页生成过程
2008/03/27 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
50个比较实用jQuery代码段
2011/09/18 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
json跨域调用python的方法详解
2017/01/11 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
应届医学毕业生求职信分享
2013/12/02 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
排查整治工作方案
2014/06/09 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
人民的好儿女观后感
2015/06/18 职场文书
入党转正申请书范文
2019/05/20 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
德生BCL3000抢先使用感受和评价
2022/04/07 无线电
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技