基于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 05 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
Dec 11 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
Feb 24 Javascript
用vue写一个仿简书的轮播图的示例代码
Mar 13 Javascript
详解Vue2 添加对scss的支持
Jan 02 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
vue实现随机验证码功能(完整代码)
Dec 10 Javascript
JS实现滑动导航效果
Jan 14 Javascript
JS如何监听div的resize事件详解
Dec 03 Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 Javascript
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
来自国外的页面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 error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP中的session安全吗?
2016/01/22 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
javascript 播放器 控制
2007/01/22 Javascript
js常用代码段整理
2011/11/30 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
javascript回调函数详解
2018/02/06 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
python操作gmail实例
2015/01/14 Python
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
基于python实现计算两组数据P值
2020/07/10 Python
Python2手动安装更新pip过程实例解析
2020/07/16 Python
新闻记者实习自我鉴定
2013/09/19 职场文书
毕业生动漫设计求职信
2013/10/11 职场文书
个人简历自我评价
2014/01/06 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
工作建议书范文
2014/05/13 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
辩论赛主持人开场白
2015/05/29 职场文书