`
johncon
  • 浏览: 27817 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

表单域与json数据间的交互

    博客分类:
  • json
阅读更多

找了几个javascript的框架,都没有找到我想要的:
提供函数,把某个表单的所有域封装成json数据格式的对象,唯有自己实现一个。

包括对象中有集合属性、对象中引用其他对象属性: 

 

/**
**json对象数据设置到表单域中
*/
function jsonObjectToForm(form, jsonObject){
	for(i = 0, max = form.elements.length; i < max; i++) {
		e = form.elements[i];
		eName = e.name;
		if(eName.indexOf('.') > 0){
			dotIndex = eName.indexOf('.');
			parentName = eName.substring(0, dotIndex);
			childName = eName.substring(dotIndex+1);
			//迭代判断eName,组装成json数据结构
			eValue = iterValueFromJsonObject(jsonObject, parentName, childName);
		}else{
			eValue = jsonObject[eName];
		}
		if(eValue && eValue != "undefined" && eValue != "null"){
			switch(e.type){
				case 'checkbox': 
				case 'radio': 
					if(e.value == eValue){
						e.checked = true;
					}
					break;
				case 'hidden': 
				case 'password': 
				case 'textarea':
				case 'text': 
					e.value = eValue;
					break;
				case 'select-one':
				case 'select-multiple':
					for(j = 0; j < e.options.length; j++){
						op = e.options[j];
						//alert("eName : " + eName + "; op value : " + op.value + "; eValue : " + eValue);
						if(op.value == eValue){
							op.selected = true;
						}
					}
					break;
				case 'button': 
				case 'file': 
				case 'image': 
				case 'reset': 
				case 'submit': 
				default:  
			}
		}
	}
}

/**
* json数组读写有两种方式
* 1: a.bs[0].id
* 2: a["bs"][0]["id"]
* 把表单转换成json数据格式
*/
function formToJsonObject(form){
	var jsonObject = {};
	for(i = 0, max = form.elements.length; i < max; i++) {
		e = form.elements[i];
		em = new Array();
		if(e.type == 'select-multiple'){
			for(j = 0; j < e.options.length; j++){
				op = e.options[j];
				if(op.selected){
					em[em.length] = op.value;
				}
			}
		}
		switch(e.type){
			case 'checkbox': 
			case 'radio': 
				if (!e.checked) { break; } 
			case 'hidden': 
			case 'password': 
			case 'select-one':
			case 'select-multiple':
			case 'textarea':
			case 'text': 
				eName = e.name;
				if(e.type == 'select-multiple'){
					eValue = em;
				}else{
					eValue = e.value.replace(new RegExp('(["\\\\])', 'g'), '\\$1');
				}
				//判断是否是对象类型数据
				if(eName.indexOf('.') > 0){
					dotIndex = eName.indexOf('.');
					parentName = eName.substring(0, dotIndex);
					childName = eName.substring(dotIndex+1);
					//迭代判断eName,组装成json数据结构
					iterJsonObject(jsonObject, parentName, childName, eValue);
				}else{
					jsonObject[eName] = eValue;
				}
				break; 
			case 'button': 
			case 'file': 
			case 'image': 
			case 'reset': 
			case 'submit': 
			default:  
		}
	}
	return jsonObject;
}

/**
* 把表单元素迭代转换成json数据
*/
function iterJsonObject(jsonObject, parentName, childName, eValue){
	//pArrayIndex用于判断元素是否是数组标示
	pArrayIndex = parentName.indexOf('[');
	//判断是否集合数据,不是则只是对象属性
	if(pArrayIndex < 0){
		var child = jsonObject[parentName];
		if(!child){
			jsonObject[parentName] = {};
		}
		dotIndex = childName.indexOf('.');
		if(dotIndex > 0){
			iterJsonObject(jsonObject[parentName], childName.substring(0, dotIndex), childName.substring(dotIndex+1), eValue);
		}else{
			jsonObject[parentName][childName] = eValue;
		}
	}else{
		pArray = jsonObject[parentName.substring(0, pArrayIndex)];
		//若不存在js数组,则初始化一个数组类型
		if(!pArray){
			jsonObject[parentName.substring(0, pArrayIndex)] = new Array();
		}
		//取得集合下标,并判断对应下标是否存在js对象
		arrayIndex = parentName.substring(pArrayIndex+1, parentName.length-1);
		var c = jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex];
		if(!c){
			jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex] = {};
		}
		dotIndex = childName.indexOf('.');
		if(dotIndex > 0){
			iterJsonObject(jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex], childName.substring(0, dotIndex), childName.substring(dotIndex+1), eValue);
		}else{
			jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex][childName] = eValue;
		}
	}
}

/**
* 迭代json数据对象设置到表单域中
*/
function iterValueFromJsonObject(jsonObject, parentName, childName){
	//pArrayIndex用于判断元素是否是数组标示
	pArrayIndex = parentName.indexOf('[');
	//判断是否集合数据,不是则只是对象属性
	if(pArrayIndex < 0){
		dotIndex = childName.indexOf('.');
		if(dotIndex > 0){
			return iterValueFromJsonObject(jsonObject[parentName], childName.substring(0, dotIndex), childName.substring(dotIndex+1));
		}else{
			return jsonObject[parentName][childName]
		}
	}else{
		pArray = jsonObject[parentName.substring(0, pArrayIndex)];
		//取得集合下标,并判断对应下标是否存在js对象
		arrayIndex = parentName.substring(pArrayIndex+1, parentName.length-1);
		var c = jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex];
		dotIndex = childName.indexOf('.');
		if(dotIndex > 0){
			return iterValueFromJsonObject(jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex], childName.substring(0, dotIndex), childName.substring(dotIndex+1));
		}else{
			return jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex][childName]
		}
	}
}

 

 

欢迎大家讨论,最近在研究jsp页面纯净,只与js有关,但这将导致rich client

 

so bad  不知道有什么好的建议没 

分享到:
评论
18 楼 shameant 2008-10-13  
dojo.formToObject 可以把FORM分装成JSON对象
17 楼 whiletrue 2008-10-13  
我想问下日期类型你是怎么判断的呢?也就是如何在json里面做标志,然后转成java对象的,学习下
fins 写道
你用什么工具做的转换啊?

json和java转换的东西我做过很多
你这个问题 建议在转换前就处理好

是int 型 还是string 型你必须要明确的告诉 转换器

目前我的做法是   json --->java 时 , 按字符串从sjon中取值
在向 java对象中赋值时 判断对象的类型 然后做响应的转换.

btw: select-multiple的数据在客户端时 都是字符串型
最后到后台是什么类型取决于你的需求.

16 楼 kimmking 2008-10-13  
ext也有这样的方法
15 楼 Scriptlet 2008-10-13  
可以参考一下ExtJS里面BasicForm的setValues和getValues方法是如何实现的
14 楼 lobbychmd 2008-10-11  
serialize()   是转成字符串,serializeArray是转成 json 对象,用 表单的 name 做key,值做value,你可以看看它的代码,和你实现的对比一下
13 楼 linux.sir 2008-10-11  
jQuery 1.2 API 参考文档中文版 里面有
serialize()
序列表表格内容为字符串。

--------------------------------------------------------------------------------

Serializes a set of input elements into a string of data. This will serialize all given elements.
返回值
jQuery

示例
序列表表格内容为字符串,用于 Ajax 请求。 

HTML 代码:

<p id="results"><b>Results: </b> </p>
<form>
  <select name="single">
    <option>Single</option>
    <option>Single2</option>
  </select>
  <select name="multiple" multiple="multiple">
    <option selected="selected">Multiple</option>
    <option>Multiple2</option>
    <option selected="selected">Multiple3</option>
  </select><br/>
  <input type="checkbox" name="check" value="check1"/> check1
  <input type="checkbox" name="check" value="check2" 
checked="checked"/> check2
  <input type="radio" name="radio" value="radio1" 
checked="checked"/> radio1
  <input type="radio" name="radio" value="radio2"/> radio2
</form> 
jQuery 代码:

$("#results").append( "<tt>" + $("form").serialize() + "</tt>" ); 


12 楼 johncon 2008-10-11  
lobbychmd 写道

jQuery的 SerialArray 不是可以吗

---有这个吗?  没找到,请问怎么用转换成java对象?  谢谢
11 楼 lobbychmd 2008-10-11  
jQuery的 SerialArray 不是可以吗
10 楼 johncon 2008-10-11  
因为我直接调用的是:
jsonObject = JSONObject.fromObject(jsonString);
JSONObject.toBean(jsonObject, clazz)
clazz是对应的java类,所以自己也就没有作判断了
看了它里面的代码,它是用json里面的类型(传过去的都是字符串)来判断,并不是用clazz里面对应属性的类型来判断的,所以真正toBean时就报了:argument type mismatch

不知道您的是怎么做的呢?  自己另外写的吗?
有什么好的方法?  没有的话,我打算修改它的代码了
9 楼 fins 2008-10-10  
你用什么工具做的转换啊?

json和java转换的东西我做过很多
你这个问题 建议在转换前就处理好

是int 型 还是string 型你必须要明确的告诉 转换器

目前我的做法是   json --->java 时 , 按字符串从sjon中取值
在向 java对象中赋值时 判断对象的类型 然后做响应的转换.

btw: select-multiple的数据在客户端时 都是字符串型
最后到后台是什么类型取决于你的需求.
8 楼 johncon 2008-10-10  
不知道您有没有在后台转换json数据格式为java对象呢?
对于select-multiple的数据类型(int、String)
封装成json时,有什么好的办法只把int的整成[1, 2, 3],String的整成['1', '2', '3']
因为在java中,可能有一类型int[],但传['1', '2', '3']时,真正转换会报错的。

不知道我这样说明白没?     谢谢
7 楼 johncon 2008-10-10  
谢谢您的提醒  
6 楼 fins 2008-10-10  
多选select情况考虑不周
---指的是select-multiple吗? 
答: 是的

引用
因为在后台的话,是把json格式数据转换成对象,所以若多个name相同的话,那就要求是:name[0]、name[1]。。。这样来构造数组形式。


你可能没理解我的意思 要么就是我没理解你. 用示例来说明吧
有这样一个json
{ 
 name : '张一' ,
 sister : [
   '张二', '张三','张四'
 ]
}


有这样一个form
<form>
姓名:<input type='text' name='name' />
姐妹们:
<input type='text' name='sister' />
<input type='text' name='sister' />
<input type='text' name='sister' />
</form>


问:
用你的函数 怎么把 这个json 添到这个form 里?
反过来又怎么从form里取数据出来 拼装成示例中那种格式的json?


引用

checkbox radiobox 考虑不周
---请指出?
disabled 和 readonly 的情况 考虑不周
---请指出?

这几个你自己思考一下吧(1 考虑不周 2 有bug)
建议你找一些现有的例子 看看人家是怎么处理的.





5 楼 achun 2008-10-10  
<p>哈哈,终于看到有人和我有相同的想法了,(以前没有发现).</p>
<p>不过,其实这个想法可以延伸的,而且我已经延伸了.那就是:</p>
<p>既然是要得到JSON的数据,那一定和form有关么?非要从form中获取么?</p>
<p>当然不是.因此我写了一个基于jQuery的扩展</p>
<pre name='code' class='js'>/*
* jQuery Ajax By Name Plugin
*
* licensed under the MIT licenses:
*   http://www.opensource.org/licenses/mit-license.php
*
* Author achun (achun.shx at gmail.com)
* Create Date: 2008-6-21
* Last Date: 2008-6-21
* Revision:2.8.6.21
*/
(function($) {
/**
* 获取鼠标点击的元素坐标
*/
$.fn.clickPos = function(e){
  var pos ={x:0,y:0};
  if (e.offsetX != undefined) {
    pos.x = e.offsetX;
    pos.y = e.offsetY;
  } else if (typeof $.fn.offset == 'function') {
    var offset = this.offset();
    pos.x = e.pageX - offset.left;
    pos.y = e.pageY - offset.top;
  } else {
    pos.x = e.pageX - this[0].offsetLeft;
    pos.y = e.pageY - this[0].offsetTop;
  }
  return pos;
}
/**
* ajaxName() 根据标签name属性来提交数据,替代form提交方式
* options:{//与ajax的options是一样的结构
* data:{}//要附加提交的数据
* }
* successful:如果元素有有效值,defualt:true
*/
$.fn.ajaxName = function(options,successful) {
if(options==undefined) options={};
options.data = options.data || {};
  successful = successful == undefined ? true:successful;
var data = {};
var name= options.name || '';
this.each(function() {
  var el=this,o=$(this),n = o.attr('name'),hasval = o.attr('value')!=undefined;
  if (!n) return;
  var t = el.type, tag = el.tagName.toLowerCase();
if (n=='/'){
if (name=='') name = hasval?o.attr('value'):o.text();
return;
}
    if (successful &amp;&amp; (el.disabled || t == 'reset' || t == 'button' ||
      (t == 'checkbox' || t == 'radio') &amp;&amp; !el.checked ||
      (t == 'submit' || t == 'image') ||
      tag == 'select' &amp;&amp; el.selectedIndex == -1))
      return;
    var v= hasval? o.attr('value').hasClass('ValueByText')?o.text():o.html();
    if (v == undefined) return;
  if (n.indexOf('.')&gt;0){
    n=n.split('.');
    var len=n.length - 1;
    var b=data;
      $.each(n,function(i){
    if (i!=len){
    if(b[this] == undefined) b[this]={};
        b=b[this];
    }else
        b[this]=v;
    });
  }else if (n.indexOf('[]')&gt;0){
    n=n.slice(0,n.length-2);
    if(data[n] == undefined) data[n]=[];
    data[n].push(v);
}else{
data[n]=v;
}
  });
  var dat={};
  if (name){
  dat[name]=data;
  data=dat[name];
  }else
  dat=data;
  for (var o in options.data){
  data[o]=options.data[o];
  };
  options.data=dat;
  return options.data;
};
})(jQuery);
</pre>
<p> 其中的clickPos扩展是为了取得图片点击提交点击坐标使用的扩展.</p>
<p>使用方法:</p>
<p>首先要调用这个使用,肯定需要element有name属性.调用类似这样的语法:</p>
<pre name='code' class='js'>var jsondat=$('#id [@name]').ajaxname()</pre>
<p>其次:我对name='/'的element做了特殊处理,比如:</p>
<pre name='code' class='html'>&lt;div name='/' value='foo'&gt;&lt;span name='user'&gt;youname&lt;/span&gt;&lt;/div&gt;</pre>
<p> 得到的结果是:</p>
<pre name='code' class='js'>{foo:{user:"youname"}}</pre>
<p>至于提交那是另外一件事情了.</p>
<p> </p>
<p>另外就是:</p>
<p>1.我的这个获取数组下标是自动增加下标的,写法类似这个</p>
<pre name='code' class='html'>&lt;li name='a[]'&gt;a0&lt;/li&gt;&lt;li name='a[]'&gt;a1&lt;/li&gt;&lt;li name='a[]'&gt;a2&lt;/li&gt;</pre>
<p>   如果不符合你的习惯,可以按照你上面的代码修改一下了.</p>
<p>2.支持"."操作符</p>
<pre name='code' class='html'>&lt;li name='a.a'&gt;a&lt;/li&gt;&lt;li name='a.b'&gt;b&lt;/li&gt;&lt;li name='a.c'&gt;c&lt;/li&gt;</pre>
<p>将获得</p>
<pre name='code' class='js'>{a:{a:'a',b:'b',c:'c'}}</pre>
<p> </p>
4 楼 johncon 2008-10-09  
fins 写道

挑一些 小毛病: 不用 var 声明函数级变量是个坏习惯 if(eValue &amp;&amp; eValue != "undefined" &amp;&amp; eValue != "null") 这句判断欠妥 json 中包含数组的情况考虑不周 form中有多个name相同元素的情况考虑不周 多选select情况考虑不周 checkbox radiobox 考虑不周 disabled 和 readonly 的情况 考虑不周 元素没有name时的策略是什么? 没有name就不处理 还是没有name取id?? 最后给个参数选择 总结: lz写的函数 目前还不适合在实际中使用



因为在后台的话,是把json格式数据转换成对象,所以若多个name相同的话,那就要求是:name[0]、name[1]。。。这样来构造数组形式。

多选select情况考虑不周
---指的是select-multiple吗?
checkbox radiobox 考虑不周
---请指出?
disabled 和 readonly 的情况 考虑不周
---请指出?

谢谢指点。。。
3 楼 fins 2008-10-09  
挑一些 小毛病:

不用 var 声明函数级变量是个坏习惯

if(eValue && eValue != "undefined" && eValue != "null") 这句判断欠妥

json 中包含数组的情况考虑不周

form中有多个name相同元素的情况考虑不周

多选select情况考虑不周

checkbox radiobox 考虑不周


disabled 和 readonly 的情况 考虑不周

元素没有name时的策略是什么? 没有name就不处理 还是没有name取id?? 最后给个参数选择


总结:
lz写的函数 目前还不适合在实际中使用
2 楼 johncon 2008-10-09  
fins 写道

不用 var 声明函数级变量是个坏习惯

   对,要改正
1 楼 fins 2008-10-09  
不用 var 声明函数级变量是个坏习惯

相关推荐

    javascript表单域与json数据间的交互第1 3页.docx

    ### JavaScript表单域与JSON数据间的交互 #### 知识点概述 在现代Web开发中,数据处理是一项核心任务,特别是在客户端与服务器之间的数据交换过程中。JavaScript作为一种强大的客户端脚本语言,提供了丰富的API来...

    javascript表单域与json数据间的交互第3 3页.docx

    #### jQuery插件实现表单域与JSON数据交互 在提供的文档示例中,作者通过自定义jQuery插件实现了表单域与JSON数据之间的交互。下面将详细解析这一插件的具体实现及其工作原理。 #### jQuery插件详解 ##### 插件...

    javascript表单域与json数据间的交互.docx

    ### JavaScript表单域与JSON数据间的交互 在Web开发中,JavaScript经常被用来处理表单数据,特别是将这些数据转化为JSON格式以便进行前后端的数据交换。本文将详细探讨如何使用JavaScript来实现表单域与JSON数据...

    javascript表单域与json数据间的交互第2 3页.docx

    ### JavaScript表单域与JSON数据间的交互 #### 引言 在现代Web开发中,JavaScript作为前端编程的主要语言之一,其与HTML表单之间的交互变得日益重要。通过将表单中的数据转换为JSON格式,我们可以更方便地进行数据...

    javascript表单域与json数据间的交互第1/3页

    JavaScript表单域与JSON数据间的交互,实质上是如何在JavaScript中将表单数据编码成JSON格式的数据,以及如何将JSON格式的数据解码到表单域中。 在描述中提到,作者没有找到能够满足特定需求的JavaScript框架,即...

    JQuery getJSON() 调用Servlet简单例子

    在这个例子中,我们将深入探讨如何使用jQuery的`getJSON()`函数与Servlet进行交互。 首先,我们来看`getJSON()`的基本用法。`getJSON()`接收三个参数:URL,数据(可选),以及一个回调函数。当服务器返回JSON数据...

    Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)

    这个示例展示了如何在前端处理JSON数据,以及如何利用Ajax异步交互实现数据的动态展示和操作。值得注意的是,尽管`eval()`在这里用于解析JSON,但它通常被认为是不安全的,因为它可以执行任意的JavaScript代码。更好...

    ajax+json实现多级联动菜单

    - 需要注意跨域问题,确保前后端之间的数据交互顺利进行。 #### 五、总结 通过以上介绍可以看出,利用Ajax+JSON技术可以高效地实现多级联动菜单功能,极大地提升了用户体验。此外,结合Struts框架的使用进一步简化...

    php和js交互

    - 适用于解决跨域问题的简单方法,通过在JavaScript中定义一个回调函数,PHP返回JSON数据包裹在该函数调用中。 - PHP:`echo $_GET['callback'] . '(' . json_encode($data) . ')';` - JavaScript:`script.src =...

    C# .net 接收 vue resources 或者axios的post请求并解析成json的方法

    在开发Web应用时,前端与后端的数据交互是不可或缺的一部分。Vue.js是一个流行的JavaScript框架,用于构建用户界面,而axios是Vue.js中常用的库,用于处理HTTP请求,包括POST请求。另一方面,C# .NET是一种强大的...

    lotus domino jqgrid显示视图例子

    5. **表单域的使用**:"表单添加域.txt"可能涉及在Lotus Domino表单中添加域(fields)以支持数据的输入和验证。这些域的数据可以被JqGrid用于显示或编辑。 总的来说,"lotus domino jqgrid显示视图例子"是一个将...

    ASP.NET项目知识点整理与项目总结

    JSONP可以请求来自其他域的JSON数据,请求的URL中通常会包含一个callback参数,用于指定服务器返回数据的回调函数名称。通过定义回调函数,可以实现跨域数据的调用和使用。 最后,项目中还提及了序列值的获取和JSON...

    extjs数据存储与传输详解

    这些类共同协作,使得开发者能够轻松地在前端应用中处理复杂的数据交互。 **Ext.data**的主要功能特点包括: 1. **异步加载**:支持异步加载数据,减少用户等待时间。 2. **类型转换**:内置对多种数据类型的转换...

    COMbiancheng.rar_site:www.pudn.com

    在给定的标题“COMbiancheng.rar”和描述中提到的“COM编程获取表单域信息”,我们可以理解这是一个关于如何利用COM组件来获取Web表单域数据的教程或代码示例。 在Web开发中,表单域是用户在HTML表单中输入数据的...

    代理中Domino对域的解析和GetItemValue使用方法

    综上所述,无论是在LotusScript还是JavaScript中,获取表单域的值都需要根据所使用的脚本语言和域的类型来采取不同的策略。LotusScript提供了更为一致的接口,而JavaScript则需要针对每种类型的域采取特定的处理方式...

    ACCP6.0使用javascript增强交互效果第三章课后习题答案

    你可能需要将JSON数据解析为JavaScript对象,或将JavaScript对象转换为JSON字符串。 在解ACCP6.0第三章的课后习题时,你需要综合运用以上知识点,通过实践加深理解。文件"MyWab"可能是完成这些习题的工具或参考资料...

    SilverLight与控制台程序托管的WCF进行垮域通讯实例

    然而,为了实现不同域之间的数据交互,WCF提供了跨域功能。在本实例中,SilverLight应用需要能够跨域调用控制台程序托管的WCF服务,这就需要配置WCF服务允许跨域请求。 4. **控制台程序托管WCF** 通常,WCF服务会...

    使用jQuery ajax提交表单代码

    首先,jQuery的$.ajax()函数是进行Ajax请求的核心,它允许我们与服务器进行异步数据通信。在“使用jQuery ajax提交表单代码”的资源中,我们可以期待看到一个清晰的示例,展示如何将表单数据发送到服务器,并处理...

    记录-笔记-html-异步读取省份和二级城市

    以上就是关于“记录-笔记-html-异步读取省份和二级城市”这个主题的主要知识点,包括jQuery的异步请求、JSON数据交换、前端与后端交互以及表单验证等。在实际开发中,理解和熟练掌握这些技术是提升网页应用性能和...

Global site tag (gtag.js) - Google Analytics