基于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 相关文章推荐
js实现每日自动换一张图片的方法
May 04 Javascript
js实现跨域访问的三种方法
Dec 09 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
详解Node.js如何开发命令行工具
Aug 14 Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 Javascript
js评分组件使用详解
Jun 06 Javascript
vue-loader教程介绍
Jun 14 Javascript
JavaScript 数组的进化与性能分析
Sep 18 Javascript
webpack 4.0.0-beta.0版本新特性介绍
Feb 10 Javascript
jQuery仿移动端支付宝键盘的实现代码
Aug 15 jQuery
vscode下vue项目中eslint的使用方法
Jan 13 Javascript
JavaScript实现筛选数组
Mar 02 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函数 serialize()和unserialize()
2012/02/04 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python实现淘宝秒杀脚本
2020/06/23 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
python找出因数与质因数的方法
2019/07/25 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
生产厂厂长岗位职责
2013/12/25 职场文书
员工年终演讲稿
2014/01/03 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
会计系毕业求职信
2014/08/07 职场文书
食品安全承诺书范文
2014/08/29 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
公司人力资源管理制度
2015/08/05 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python